使用STS4和Youtube Data API v3创建一个简单的网页应用程序

一、目录
二、目录清单
三、目录索引
四、目录列表
五、目次表

1.起始
2.概览
3.生成API密钥
4.创建STS4项目

首先

本次我们将介绍使用YouTube Data API v3和Spring Tool Suite 4(STS4)创建简单web应用的步骤。

首先,我将列出正在使用的软件清单及其版本。版本等如下所示:

・春季工具套件4(STS4) 4-4.17.0
・YouTube数据API v3-rev222-1.25.0
・谷歌云平台(GCP)

概述

image.png

這個API是免費使用的,但會有請求數量的限制,因此在進行除錯等操作時需要注意剩餘次數(可以申請提高限制的上限)。
本次將不詳細介紹解除請求數量限制的方法。

3. 发行API密钥

请点击以下链接访问Google Cloud,并进行API密钥和OAuth客户端ID的发行。
https://console.cloud.google.com/apis/dashboard

选项1:
步骤1:登录Google Cloud后,选择下拉菜单”选择项目”。

第二步。弹出一个窗口,选择右上角的”新建项目”。选择后,将显示用于创建项目的界面,请输入适当的项目名称,并点击”创建”按钮。

1.png

确认项目名称在下拉菜单中显示后,点击左侧菜单栏中的“认证信息”。从“创建认证信息”中选择“API密钥”,然后点击。

如果API密钥显示出来,那么创建就完成了。
您可以在左侧菜单栏的“认证信息”中查看创建的API密钥。

2.png

激活Youtube Data API v3.

进行如下步骤:点击”启用API服务”。之后,API库画面会显示出来,然后在搜索栏中输入”youtube”进行搜索,并从搜索结果中选择”YouTube数据API v3″。

3.png

执行步骤2,选择”启用”,将API激活。

4.png

4. 创建STS4项目

image.png

第二步,编辑pom.xml文件。
请注意,如果这里的版本设置不正确,Java代码可能无法正常运行。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.0.6</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	
	<groupId>com.hoge</groupId>
	<artifactId>HogeProject-01</artifactId>
	<packaging>jar</packaging>
	<version>0.0.1-SNAPSHOT</version>
	
	<name>HogeProject-01</name>
	<url>http://maven.apache.org</url>
	
	<description>Demo project for Spring Boot</description>
	
	<properties>
		<project.youtube.version>v3-rev222-1.25.0</project.youtube.version>
	    <project.http.version>1.25.0</project.http.version>
	    <project.oauth.version>1.25.0</project.oauth.version>
	    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>17</java.version>
	</properties>
	
	<repositories>
	    <repository>
	      <id>google-api-services</id>
	      <url>http://google-api-client-libraries.appspot.com/mavenrepo</url>
	    </repository>
  	</repositories>
  	
	<dependencies>
		<!-- YouTube Data V3 support -->
        <dependency>
	      <groupId>com.google.apis</groupId>
	      <artifactId>google-api-services-youtube</artifactId>
	      <version>${project.youtube.version}</version>
	    </dependency>
	
	    <dependency>
	      <groupId>com.google.http-client</groupId>
	      <artifactId>google-http-client-jackson2</artifactId>
	      <version>${project.http.version}</version>
	    </dependency>
	
	    <dependency>
	      <groupId>com.google.oauth-client</groupId>
	      <artifactId>google-oauth-client-jetty</artifactId>
	      <version>${project.oauth.version}</version>
	    </dependency>
	
	    <dependency>
	        <groupId>com.google.collections</groupId>
	        <artifactId>google-collections</artifactId>
	        <version>1.0</version>
	    </dependency>
	    <!-- YouTube Data V3 support -->
	    
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>
		<dependency>
			<groupId>org.thymeleaf.extras</groupId>
			<artifactId>thymeleaf-extras-springsecurity6</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-test</artifactId>
			<scope>test</scope>
		</dependency>
       <!-- DBは今回は使用しない -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.31</version>
			<scope>runtime</scope>
		</dependency>
       <!-- DBは今回は使用しない -->
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<version>1.2.1</version>
				<configuration>
          			<mainClass>com.hoge.api.SampleAPI</mainClass>
        		</configuration>
			</plugin>
			
			<!-- Forces Maven to use Java 1.6 -->
	      	<plugin>
		        <artifactId>maven-compiler-plugin</artifactId>
		        <version>2.3.2</version>
		        <configuration>
		            <source>1.6</source>
		            <target>1.6</target>
		            <compilerArgument></compilerArgument>
		        </configuration>
	        </plugin>
		</plugins>
	</build>

</project>

创建一个Controller类。

package com.hoge.controller;

import com.hoge.api.SampleAPI;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import jakarta.servlet.http.HttpServletRequest;

@Controller
public class ViewController {
	
	@GetMapping("/")
	public String homeGet(Model model, HttpServletRequest request) {
		try {
			model.addAttribute("video", new SampleAPI().getSearchList());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "view.html";
	}
}

创建一个名为SampleAPI的类,用于获取视频信息的步骤4。

package com.hoge.api;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.youtube.YouTube;
import com.google.api.services.youtube.YouTube.Search;
import com.google.api.services.youtube.model.SearchListResponse;
import com.hoge.model.VideoBean;

public class SampleAPI {
	/** Global instance of YouTube object to make all API requests. */
	private static YouTube youtube;
	private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
    private static final String PROPERTIES_FILENAME = "youtube.properties";
    
    /** HTTPリクエストの初期化クラス */
    private static final HttpRequestInitializer HTTP_REQUEST_INITIALIZER = new HttpRequestInitializer() {
        public void initialize(HttpRequest request) throws IOException {}
    };
    
    // 検索したい動画情報の取得
    public List<VideoBean> getSearchList() throws Exception {

        List<VideoBean> list = new ArrayList<>();
        
        try {
			// youtubeオブジェクト生成
			youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, HTTP_REQUEST_INITIALIZER).setApplicationName("youtube-web2023").build();
			  
			// apikeyをセットする
			Properties properties = new Properties();
   
			// プロパティファイルに定義したAPIキーを設定する
	        InputStream in = Search.class.getResourceAsStream("/" + PROPERTIES_FILENAME);
	        properties.load(in);
            String apiKey = properties.getProperty("youtube.apikey");
            
            // 検索結果のbean
        	SearchListResponse res = new SearchListResponse();
            YouTube.Search.List search = youtube.search().list("snippet")
            		.setQ("三毛猫") // 検索したいキーワードを入力する
            		.setKey(apiKey);
            
            // VideoBeanにデータを格納する
		    do {
		    	res = search
			    	.setMaxResults(50L) // 最大50件
			    	.setPageToken(res.getNextPageToken())
			    	.execute();
		    	
	            for (int i = 0; i < res.getItems().size(); i++) {
	            	VideoBean bean = new VideoBean();
	            	bean.setVideoTitle(res.getItems().get(i).getSnippet().getTitle()); // 動画タイトル
	            	bean.setThumbnail((res.getItems().get(i).getSnippet().getThumbnails().getDefault().getUrl())); // サムネイル画像)
	            	list.add(bean);
            }
		    } while (res.getNextPageToken() != null); // 51件以降のデータも格納する
		    
        } catch (GoogleJsonResponseException e) {
        	e.printStackTrace();
            System.err.println("There was a service error: " + e.getDetails().getCode() + " : " + e.getDetails().getMessage());
            
        } catch (Throwable t) {
            t.printStackTrace();
        }
        //登録しているチャンネルのidを返却する
		return list;
    }
}

第五步:创建名为”youtube.properties”的文件,并根据以下内容进行编辑。将其存放在之前第二步和第三步中创建的Java文件所在的同一包下。

youtube.apikey=ここに作成したapiキーを貼り付け

步骤6:在templates中创建用于显示的HTML类。

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<meta charset="UTF-8">
</head>
<body>
	<table border="1" class="nara-table" style="table-layout: fixed;">
		<thead>
			<tr>
				<th style="background:#AD002D;font-weight: bold;color:#fff;">動画のタイトル</th>
				<th style="background:#AD002D;font-weight: bold;color:#fff;">サムネイル</th>
			</tr>
		</thead>
		<th:block th:each="v : ${video}">
			<tbody>
			  	<tr>
				    <td th:text="${v.videoTitle}"></td>
				    <td><img th:src="@{${v.thumbnail}}" /></td>
			  	</tr>
			  </tbody>
		</th:block>
	</table>
</body>
</html>

第六步。这次,我们需要视频的标题和缩略图信息,因此我们将创建一个仅存储所需信息的bean。

package com.hoge.model;

public class VideoBean {
	
	private String videoTitle = "";
	private String thumbnail = "";
 
	public String getVideoTitle() {
		return videoTitle;
	}
	public void setVideoTitle(String videoTitle) {
		this.videoTitle = videoTitle;
	}
	public String getThumbnail() {
		return thumbnail;
	}
	public void setThumbnail(String thumbnail) {
		this.thumbnail = thumbnail;
	}
}
广告
将在 10 秒后关闭
bannerAds