[JAVA] 03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal

Aperçu

Il est maintenant possible de se connecter à la base de données dans Dernière fois. Cette fois, utilisons RestTemplate pour envoyer une requête à une API externe et recevoir la réponse. L'API utilisée cette fois est API de recherche de code postal.

Qu'est-ce que l'API de recherche par code postal?

En ajoutant des paramètres de requête à l'URL de base et en envoyant C'est une API qui renvoie les résultats de la recherche sous forme d'objet JSON. Pour plus de détails, reportez-vous à Link.

Créons maintenant une API.

Sujet principal

La configuration cette fois est une classe de contrôleur qui reçoit le code postal en tant que paramètre de requête, et Créons une classe de client qui envoie le code postal en tant que paramètre de requête à l'API de recherche de code postal et reçoit le résultat. (Je vais omettre la classe de données) Puisque nous recevrons le code postal en tant que valeur d'entrée, nous mettrons également en œuvre une validation simple et des gestionnaires d'erreurs.

1. Créer un contrôleur + une contrainte

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",
                "Le code postal que vous avez entré est incorrect.",
                null
        );
        return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);  // (4)
    }
}

Ensuite, je donnerai une brève explication après la dernière fois. (1). La validation est activée par «@ Validated». Vous pouvez également vérifier la validation en ajoutant votre propre annotation (@ ZipCode) au paramètre de requête, et si elle enfreint, uneConstraintViolationException sera lancée. (2) Mise en œuvre d'annotations auto-faites. Pour plus de détails, veuillez consulter l'article ici, mais la logique de validation n'est que la partie @ Pattern. (3). En ajoutant @ RestControllerAdvice, vous pouvez implémenter le processus (** AOP **) commun à tous les contrôleurs avec @ RestController. Si le contrôleur lève une exception qui correspond à l'argument de @ ExceptionHandler, cette méthode fonctionnera. Je pense que cette combinaison est souvent utilisée, il est donc utile de s'en souvenir. (4). La valeur de retour du gestionnaire implémenté en utilisant @ ExceptionHandler doit être la classe ResponseEntity. Il le convertira bien en une réponse HTTP en utilisant le corps et l'état HTTP donnés par cela. En passant, vous pouvez également spécifier l'attribut Header.

C'est à peu près comme ça. Comme vous pouvez le voir en regardant les expressions régulières, nous avons une politique qui "-" peut ou non être présent selon les spécifications de l'API de recherche de code postal. Vient ensuite la classe Client.

2. Faire un 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 est initialisé dans le constructeur. Vous pouvez l'initialiser avec chaque méthode d'implémentation, mais cette fois nous avons supposé que plusieurs méthodes seraient implémentées et que la partie commune serait initialisée avec le constructeur. rootUri définit l'URI de la demande qui devient la racine telle quelle, et ʻadditionalInterceptorsdéfinit le format de la réponse. (2) Une méthode d'implémentation qui envoie une requête et reçoit une réponse. Passez le chemin de la requête dans le premier argument de la méthodegetForObject (), la classe de réponse dans le deuxième argument et la valeur à mapper au paramètre dans le troisième argument. En tant qu'implémentation, c'est tout ce dont vous avez besoin pour envoyer une demande et recevoir une réponse. (3) En ajoutant la classe qui implémente ClientHttpRequestInterceptor à RestTemplate, vous pourrez recevoir la réponse dans ʻapplication / json. Veuillez consulter ici et ici. * Le montage est en pakuri rond.

C'est tout ce que vous devez faire. Enfin, frappons l'API de Postman pour voir si cela fonctionne comme prévu!

3. Essayez de le frapper

Utilisons les 5 modèles suivants comme modèles de test.

  1. Envoyez un code postal existant (avec tiret) ⇒ Les informations d'adresse peuvent être obtenues
  2. Envoyez un code postal existant (sans tirets) ⇒ Vous pouvez obtenir des informations d'adresse
  3. Envoyer un code postal inexistant ⇒ Vous pouvez obtenir les informations d'adresse dans un état vide
  4. Violation de validation (nombre de chiffres insuffisant) ⇒ Erreur de validation
  5. Violation de validation (tirets multiples) ⇒ Erreur de validation

Allons-y.

3-1. Envoyer le code postal existant (avec tiret) ⇒ Les informations d'adresse peuvent être obtenues

Résultat: ** OK !! ** </ font> 打鍵2.png

3-2. Envoyer le code postal existant (sans tiret) ⇒ Les informations d'adresse peuvent être obtenues

Résultat: ** OK !! ** </ font> 打鍵1.png

3-3. Envoyer un code postal inexistant ⇒ Vous pouvez obtenir les informations d'adresse dans un état vide

Résultat: ** OK !! ** </ font> 打鍵3.png

3-4. Violation de validation (nombre de chiffres insuffisant) ⇒ Erreur de validation

Résultat: ** OK !! ** </ font> 打鍵4.png

3-5. Violation de validation (tirets multiples) ⇒ Erreur de validation

Résultat: ** OK !! ** </ font> 打鍵5.png

Il semble fonctionner en toute sécurité! !!

finalement

Vous pouvez désormais également envoyer des requêtes à des API externes! J'ai également pu mettre en place un contrôle de validation simple mais facile, donc Je pense que vous pouvez maintenant créer une API simple!

Si vous avez des erreurs, nous apprécions vos commentaires! Merci d'avoir lu jusqu'au bout! !!

Recommended Posts