Es ist jetzt möglich, in [Letztes Mal] eine Verbindung zur Datenbank herzustellen (https://qiita.com/supreme0110/items/504781e5087f4c4e771b). Verwenden Sie dieses Mal RestTemplate, um eine Anforderung an eine externe API zu senden und die Antwort zu empfangen. Die diesmal verwendete API ist Postleitzahlensuch-API.
Durch Hinzufügen von Abfrageparametern zur Basis-URL und Senden Es ist eine API, die Suchergebnisse als JSON-Objekt zurückgibt. Weitere Informationen finden Sie unter Link.
Jetzt erstellen wir eine API.
Die Konfiguration ist diesmal eine Controller-Klasse, die die Postleitzahl als Abfrageparameter empfängt, und Erstellen wir eine Clientklasse, die die Postleitzahl als Abfrageparameter an die Postleitzahlensuch-API sendet und das Ergebnis empfängt. (Ich werde die Datenklasse weglassen) Da wir die Postleitzahl als Eingabewert erhalten, implementieren wir auch einfache Validierungs- und Fehlerbehandlungsroutinen.
GetAddressController.java
@RestController
@RequiredArgsConstructor
@Validated // (1)
public class GetAddressController {
private final GetAddressApiClient client;
@GetMapping("/get/address")
public GetAddressResponse getAddress(@ZipCode @RequestParam("zipcode") String zipCode) { // (1)
return GetAddressResponse.create(client.request(zipCode));
}
}
ZipCode.java
@Documented
@Constraint(validatedBy = {})
@Target(PARAMETER)
@Retention(RUNTIME)
@Pattern(regexp = "[0-9]{3}[-]{0,1}[0-9]{4}") // (2)
public @interface ZipCode {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
CommonExceptionHandler.java
@RestControllerAdvice // (3)
public class CommonExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class) // (3)
public ResponseEntity handleConstraintViolationException(ConstraintViolationException ex) {
GetAddressResponse response = new GetAddressResponse(
"400",
"Die von Ihnen eingegebene Postleitzahl ist falsch.",
null
);
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); // (4)
}
}
Dann werde ich nach dem letzten Mal eine kurze Erklärung geben.
(1) Die Validierung wird durch "@ Validated" aktiviert. Sie können die Validierung auch überprüfen, indem Sie dem Abfrageparameter eine eigene Anmerkung (@ ZipCode
) hinzufügen. Wenn diese verletzt wird, wird eineConstraintViolationException
ausgelöst.
(2) Implementierung einer selbst erstellten Anmerkung. Weitere Informationen finden Sie im Artikel hier. Die Validierungslogik ist jedoch nur der Teil "@ Pattern".
(3) Durch Hinzufügen von "@ RestControllerAdvice" können Sie den Prozess (** AOP **) implementieren, der allen Controllern mit "@ RestController" gemeinsam ist. Wenn der Controller eine Ausnahme auslöst, die dem Argument von "@ ExceptionHandler" entspricht, funktioniert diese Methode. Ich denke, diese Kombination wird oft verwendet, daher ist es nützlich, sich daran zu erinnern.
(4) Der Rückgabewert des Handlers, der mit @ ExceptionHandler
implementiert wurde, sollte die Klasse ResponseEntity
sein. Es wird es gut in eine HTTP-Antwort konvertieren, wobei der Text und der HTTP-Status verwendet werden, die von diesem angegeben werden. Sie können übrigens auch das Header-Attribut angeben.
Es ist ungefähr so. Wie Sie anhand der regulären Ausdrücke sehen können, haben wir eine Richtlinie, dass "-" gemäß den Spezifikationen der Postleitzahlensuch-API vorhanden sein kann oder nicht. Als nächstes kommt die Client-Klasse.
GetAddressApiClient.java
@Component
public class GetAddressApiClient {
private final RestTemplate restTemplate;
public GetAddressApiClient(RestTemplateBuilder restTemplateBuilder,
ResponseHeaderInterceptor interceptor) { // (1)
restTemplate = restTemplateBuilder
.rootUri("http://zipcloud.ibsnet.co.jp")
.additionalInterceptors(interceptor)
.build();
}
public GetAddressApiResponse request(String zipCode) {
return restTemplate.getForObject("/api/search?zipcode={zipCode}", // (2)
GetAddressApiResponse.class,
zipCode);
}
}
ResponseHeaderInterceptor.java
@Component
public class ResponseHeaderInterceptor implements ClientHttpRequestInterceptor {
@Override // (3)
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
ClientHttpResponse response = execution.execute(request, body);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response;
}
}
(1). RestTeplate
wird im Konstruktor initialisiert. Sie können es mit jeder Implementierungsmethode initialisieren. Diesmal haben wir jedoch angenommen, dass mehrere Methoden implementiert und der gemeinsame Teil mit dem Konstruktor initialisiert wird. rootUri
legt den Anforderungs-URI fest, der der Stamm sein soll, und zusätzlicheInterceptors
legt das Antwortformat fest.
(2) Eine Implementierungsmethode, die eine Anfrage sendet und eine Antwort empfängt. Übergeben Sie den Anforderungspfad im ersten Argument der Methode "getForObject ()", die Antwortklasse im zweiten Argument und den Wert, der dem Parameter im dritten Argument zugeordnet werden soll. Als Implementierung ist dies alles, was Sie benötigen, um eine Anfrage zu senden und eine Antwort zu erhalten.
(3) Wenn Sie die Klasse, die "ClientHttpRequestInterceptor" implementiert, zu "RestTemplate" hinzufügen, können Sie die Antwort in "application / json" erhalten. Weitere Informationen finden Sie unter hier und hier. * Die Montage erfolgt rund pakuri.
Das ist alles was Sie tun müssen. Zum Schluss klicken wir auf die API von Postman, um zu sehen, ob sie wie erwartet funktioniert!
Verwenden wir die folgenden 5 Muster als Testmuster.
Lass es uns treffen.
Ergebnis: ** OK !! ** </ font>
Ergebnis: ** OK !! ** </ font>
Ergebnis: ** OK !! ** </ font>
Ergebnis: ** OK !! ** </ font>
Ergebnis: ** OK !! ** </ font>
Es scheint sicher zu funktionieren! !!
Sie können jetzt auch Anfragen an externe APIs senden! Ich konnte also auch eine einfache, aber einfache Validierungsprüfung durchführen Ich denke, Sie können jetzt eine einfache API erstellen!
Wenn Sie Fehler haben, freuen wir uns über Ihre Kommentare! Vielen Dank für das Lesen bis zum Ende! !!