[JAVA] 03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet

Überblick

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.

Was ist die 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.

Hauptthema

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.

1. Erstellen Sie Controller + Constraint

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.

2. Machen Sie einen Client

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!

3. Versuchen Sie es zu treffen

Verwenden wir die folgenden 5 Muster als Testmuster.

  1. Senden Sie eine vorhandene Postleitzahl (mit Bindestrich) ⇒ Adressinformationen können abgerufen werden
  2. Senden Sie eine vorhandene Postleitzahl (ohne Bindestriche) ⇒ Sie können Adressinformationen erhalten
  3. Senden Sie eine nicht vorhandene Postleitzahl ⇒ Sie können die Adressinformationen in einem leeren Zustand erhalten
  4. Validierungsverletzung (unzureichende Anzahl von Ziffern) ⇒ Validierungsfehler
  5. Validierungsverletzung (mehrere Bindestriche) ⇒ Validierungsfehler

Lass es uns treffen.

3-1 Vorhandene Postleitzahl senden (mit Bindestrich) ⇒ Adressinformationen erhalten Sie

Ergebnis: ** OK !! ** </ font> 打鍵2.png

3-2 Vorhandene Postleitzahl senden (ohne Bindestrich) ⇒ Adressinformationen können abgerufen werden

Ergebnis: ** OK !! ** </ font> 打鍵1.png

3-3. Senden Sie eine nicht vorhandene Postleitzahl ⇒ Sie können die Adressinformationen in einem leeren Zustand erhalten

Ergebnis: ** OK !! ** </ font> 打鍵3.png

3-4. Validierungsverletzung (unzureichende Anzahl von Ziffern) ⇒ Validierungsfehler

Ergebnis: ** OK !! ** </ font> 打鍵4.png

3-5. Validierungsverletzung (mehrere Bindestriche) ⇒ Validierungsfehler

Ergebnis: ** OK !! ** </ font> 打鍵5.png

Es scheint sicher zu funktionieren! !!

Schließlich

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! !!

Recommended Posts