[JAVA] J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.

Public cible pour lire l'article

・ Ceux qui utilisent une API externe pour la première fois ・ Débutant au printemps

J'écris en supposant que.

Objectif

Je pense que chaque entreprise crée souvent des micro-services et les fournit sous forme d'API externes. Parmi eux, lors de l'incorporation d'une API externe dans mon service, je voudrais l'utiliser pour de futurs travaux en apprenant à utiliser la bibliothèque cliente et à utiliser de base comme le mappage des données au format Json vers des objets Java. Je suis.

Livrables

GithubAPITest.gif

En appuyant sur l'API de recherche GitHub, le référentiel est recherché par langue, et le nom du référentiel et le nom d'utilisateur, ainsi que la vue d'ensemble du référentiel sont acquis et affichés.

environnement

FW:spring-boot 2.2.5 Moteur de modèle: thymeleaf 3.0.4 Bibliothèque cliente HTTP: okhttp3 4.4.1 Bibliothèque de conversion mutuelle de Json en objet Java: gson 2.8.6

Puisque Maven est utilisé pour la gestion de projet, les dépendances sont décrites dans pom.xml.

pom.xml


<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.4.1</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

À propos de l'API de recherche GitHub

Officiel de l'API de recherche GitHub

Vous pouvez rechercher des référentiels, des utilisateurs, des problèmes et des relations publiques. C'est très simple à utiliser et vous n'avez pas besoin de vous inscrire en tant que membre à l'avance (cependant, le nombre de demandes est limité).

https://api.github.com/search/repositories?q=Rechercher un mot

https://api.github.com/search/repositories?q=java Si vous essayez d'entrer l'URL ci-dessus dans votre navigateur, vous verrez que les résultats de la recherche pour le mot de recherche "java" sont affichés dans votre navigateur. Vous pouvez également rechercher et trier la langue du programme en la personnalisant comme ? Q = mot de recherche + langue: ruby (voir l'URL ci-dessus pour plus de détails).

Après cela, convertissez ce contenu de Json en Java et affichez-le dans Thymeleaf.

Explication du code source

Gson

[Java] Convertir JSON en Java et Java en JSON-Comment utiliser GSON et Jackson-

Tout d'abord, créez un POJO pour stocker les paramètres Json en Java comme décrit ci-dessus. Plus précisément, j'ai tapoté l'API de manière appropriée, copié et collé les paramètres affichés sur le navigateur et créé un POJO avec jsonschema2pojo. Très pratique. .. ..

Si vous utilisez jsonschema2pojo, vous obtiendrez trois classes, Exemple, Item et Owner. J'ai renommé uniquement «Exemple» en «ResultApi».

@SerializedName

En ajoutant l'annotation @SerializedName (com.google.gson.annotations.SerializedName) au membre cible, vous pouvez modifier le nom de l'élément au moment de la sortie JSON en une valeur de votre choix.

@Expose

En standard Serializable, les champs avec transitoire ne sont pas sérialisés (non enregistrés). Dans Gson, seuls les champs avec l'annotation Expose peuvent être sérialisés.

Source: GSON1, [GSON2](http://www.ne.jp/asahi/hishidama/home/ tech / java / google / gson.html)

okhttp3

J'ai fait référence à Comment POST JSON dans Java-Méthode en utilisant OkHttp3 et Méthode en utilisant HttpUrlConnection-.

Normalement, lorsque nous accédons à un serveur Web, nous y accédons via une communication HTTP via un navigateur, mais le contenu de la requête n'est que le mot de recherche, et il est affiché sur le navigateur sans rien savoir de spécial. Je vais. Lorsque vous faites cela par programme, c'est une bibliothèque qui émet des demandes, crée des informations sur le client, exécute la communication HTTP, stocke les résultats de la réponse, etc.

manette

DemoGetApiController.java


@Controller
public class DemoGetApiController {

	@ModelAttribute
	ResultApi init() {
		return new ResultApi();
	}

	@GetMapping("/apitest")
	String readme(Model model) throws IOException {
		return "rest/apiTest";
	}

	@PostMapping("/apitest")
	String search(
			@RequestParam(name = "target", required = false) String target,
			@RequestParam(name = "language", required = false) String language,
			Model model) throws IOException {

		//Créer une URL. Le mot de recherche et le bouton radio sont acquis lors de la communication postérieure et stockés dans l'URL.
		String url = "https://api.github.com/search/repositories?q=" + target + "+" + "language:" + language;

		//Nous avons préparé les informations requises pour la communication HTTP. Enfin, le résultat est stocké dans le corps de la réponse.
		OkHttpClient client = new OkHttpClient();
		Request request = new Request.Builder().url(url).build();
		Call call = client.newCall(request);
		Response response = call.execute();
		ResponseBody body = response.body();

		//Les informations au format json sont stockées dans POJO créé par jsonschema2pojo.
		String json = body.string();
		Gson gson = new Gson();
		ResultApi resultApi = gson.fromJson(json, ResultApi.class);

		model.addAttribute("resultApi", resultApi);
		return "rest/apiTestResult";
	}
}

@RequestParam (name =" target ", required = false) String target stocke le mot de recherche. @RequestParam (name =" language ", required = false) String language stocke le langage de programmation des boutons radio.

Pour plus de détails sur l'utilisation de Gson et Http3, veuillez vous référer à l'URL ci-dessus. ResultApi / Item / Owner de POJO est omis.

Vue

apiTest


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<link href="/css/style.css" th:href="@{/css/style.css}" rel="stylesheet" type="text/css"></link>
<title>tester</title>
</head>
<body>
	<form th:action="@{'/apitest'}" method="post">
		<input type="text" name="target">
		<button>Chercher</button>
		<p>
			<label><input type="radio" name="language" value="java" checked>java</label>
			<label><input type="radio" name="language" value="ruby">ruby</label>
			<label><input type="radio" name="language" value="c#">c#</label>
			<label><input type="radio" name="language" value="python">python</label>
			<label><input type="radio" name="language" value="javascript">javascript</label>
			<label><input type="radio" name="language" value="c"> c</label>
		</p>
	</form>
</body>
</html>

apiTestResult


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<link href="/css/style.css" th:href="@{/css/style.css}" rel="stylesheet"
	type="text/css"></link>
<title>tester</title>
</head>
<body>
	<a th:href="@{'/apitest'}">Revenir</a>
	<div class="gitContents">
		<div class="card card-skin" th:each="item, stat : ${resultApi.items}">
			<div class="card__imgframe">
				<img th:src="${item.owner.avatarUrl}">
			</div>
			<div class="card__textbox">
				<div class="card__titletext">
					<a th:href="${item.htmlUrl}"><span th:text="${item.name}"></span></a>
				</div>
				<div class="card__overviewtext">
					<ul>
						<li>USER : <span th:text="${item.owner.login}"></span></li>
						<li>DESCRIPTION : <span th:text="${item.description}"></span></li>
					</ul>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

Cette fois, le nom USER et le résumé du référentiel sont extraits et affichés. De plus, vous pouvez également obtenir le nombre d'étoiles, le nombre de fourches, etc. CSS omis.

Impressions

Je pense que vous avez appris à utiliser l'API externe de base. Ensuite, au contraire, je voudrais défier de créer une API et de la sortir au format Json! !!

Recommended Posts

J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
Créez une application de recherche simple avec Spring Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Faisons une API simple avec EC2 + RDS + Spring boot ①
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
J'ai créé un système d'exemple MVC simple à l'aide de Spring Boot
Implémentez un serveur API Web REST simple avec Spring Boot + MySQL
Créer un serveur API Web avec Spring Boot
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
Créez un site de démonstration simple avec Spring Security avec Spring Boot 2.1
J'ai écrit un test avec Spring Boot + JUnit 5 maintenant
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
J'ai créé une interface graphique avec Swing
J'ai fait une simple fonction de recommandation.
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 1/3 (paramètres Jasper Reports)
[Rails] J'ai créé une mini-application de calendrier simple avec des spécifications personnalisées.
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 3/3 (contrôle Spring MVC)
02. J'ai créé une API pour me connecter de Spring Boot à MySQL (My Batis)
[Ruby] J'ai créé un simple client Ping
Créez un lot à la demande simple avec Spring Batch
J'ai fait une mort risquée avec Ruby
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai créé une application Janken avec kotlin
J'ai créé une application Janken avec Android
Test de validation de classe de formulaire avec Spring Boot
Forme de botte de printemps
Créez un site Web avec Spring Boot + Gradle (jdk1.8.x)
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
Je voulais classer la botte à ressort dans un multi-projet
J'ai créé un robot LINE avec Rails + heroku
Créer un environnement de développement Spring Boot avec docker
J'ai fait un portfolio avec Ruby On Rails
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports Extra (édition Variables)
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports Extra Edition (édition d'image)
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
J'ai créé un domaine api avec Spring Framework. Partie 2
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Notez que j'étais accro au traitement par lots avec Spring Boot
[Spring Boot] Obtenez des informations utilisateur avec l'API Rest (débutant)
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
SSO avec GitHub OAuth dans l'environnement Spring Boot 1.5.x
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
J'ai créé un serveur et un client Restful au printemps.
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Un mémorandum lors de la création d'un service REST avec Spring Boot
J'ai créé un domaine api avec Spring Framework. Partie 1
Nginx + Spring Boot Parrot Return LineBot fait avec VPS
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Télécharger avec Spring Boot
Implémentation d'une API forte pour "Je veux afficher ~~ à l'écran" avec un simple CQRS
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.