[JAVA] Utilisez le modèle de repos Gekitsuyo pour la communication REST

RestTemplate

Qu'est-ce que RestTemplate?

RestTemplate est une classe qui fournit des méthodes pour appeler l'API REST (API Web). Client HTTP fourni par Spring Framework (wrapping HttpClient).

En résumé, un composant pratique qui permet une communication REST facile.

Il convertit le DTO en demande de format Json et lie la réponse au format Json au DTO. En plus de Json, divers formats de données tels que Xml et Form sont pris en charge et peuvent être personnalisés !!

DTO => Json

DTO


@Getter // (1)
@Setter // (1)
public class SomeRequestResource {
    private String message; // (2)
}

(1) Getter et Setter sont automatiquement générés en utilisant lombock dans la bibliothèque. (2) Champs qui reflètent la conversion Json plus tard

Json


{
  "messsage": "test message"
}

Les noms et valeurs des champs DTO sont convertis au format Json

Json => DTO

Json


{
  "messsage": "test message"
}

DTO


@Getter
@Setter
public class SomeRequestResource {
    private String message; // (1)
}

(1) Champ auquel la valeur de Json est liée

Comment utiliser RestTemplate

"Kihon" no Ki

Injection pour le moment

@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    // ...

}

Injectez cette fois le modèle de repos principal. Ce «modèle de repos» contient des pièces utilisées pour la communication REST.

Essayez d'envoyer GET

@Getter
@Setter
public class TestResponseResource {
    private String id;      // (1)
    private String message; // (1)
}

(1) Champ pour lier la réponse

@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    public static final String URL = "http://com.example.rest/test";

    public TestResponseResource getTestResponse() {
      // (1)
      return restTemplate.getForObject(URL, TestResponseResource.class);
    }

}

(1) Envoyez GET. (1) Argument de getForObject

Ordre des arguments Moule La description
1 String URL de destination
2 Class<T> Retour de la destinationResponseBodyClasse à lier

Essayez d'envoyer POST

@Getter
@Setter
public class TestRequestResource {
    private String message;  // (1)
}

(1) Valeur à envoyer

@Getter
@Setter
public class TestResponseResource {
    private String id;      // (1)
    private String message; // (1)
}

(1) Champ pour lier la réponse

@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    public static final String URL = "http://com.example.rest/test";

    public TestResponseResource getTestResponse() {
      // (1)
      TestRequestResource request = new TestRequestResource();
      request.setMessage("test message");

      // (2)
      return restTemplate.postForObject(URL,request,TestResponseResource.class);
    }

}

(1) Réglez les données de transmission (2) Transmission POST (2) Argument de postForObject

Ordre des arguments Moule La description
1 String URL de destination
2 Object Valeur à envoyer
3 Class<T> Retour de la destinationResponseBodyClasse à lier

"Kihon"

Changer dynamiquement l'URL d'envoi

Dans le cas d'une communication REST, les informations «id» de la ressource peuvent être obtenues à partir de l'URL. Exemple) http: // com.example.rest / book / 1

Dans le cas de RestTemplate, il peut être implémenté dans plusieurs modèles.

Dans l'ordre, motif de griffe PathParameter
@Getter
@Setter
public class BookResponseResource {
    private String id;
    private String message;
}
@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    // (1)
    public static final String URL = "http://com.example.rest/book/{id}";

    public TestResponseResource getTestResponse() {
      // (2)
      return restTemplate.getForObject(URL, BookResponseResource.class, "1");
    }

}

(1) Les paramètres sont liés à {id} (2) Passez la chaîne de caractères que vous souhaitez lier au paramètre à la fin de l'argument. Puisqu'il est pris avec un argument de longueur variable, plusieurs spécifications peuvent être spécifiées.

Motif de griffes explicite
@Getter
@Setter
public class BookResponseResource {
    private String id;
    private String message;
}
@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    // (1)
    public static final String URL = "http://com.example.rest/book/{id}";

    public BookResponseResource getTestResponse() {
      // (2)
      Map<String, String> params = new HashMap<String, String>();
      params.put("id", "1");
      // (3)
      return restTemplate.getForObject(URL, BookResponseResource.class, params);
    }
}

(1) Les paramètres sont liés à {id} (2) Définissez la valeur à lier au paramètre (2) Passez le Map <String, String> de la valeur que vous souhaitez lier au paramètre à la fin de l'argument.

Modifier les informations d'en-tête à envoyer

Il peut être modifié de manière flexible lorsque le format des données à envoyer est modifié, tel que XML, lorsque le code de caractère est modifié ou lorsque vous souhaitez envoyer un en-tête spécial.

Changer le type de contenu

Lors de la modification uniquement de Content-Type
public BookResponseResource getTestResponse(BookRequestResource request) {
    RequestEntity<BookRequestResource> requestEntity = 
        RequestEntity
          .post(new URI(URL))
          .contentType(MediaType.APPLICATION_XML) // (1)
          .body(request);

    return restTemplate.getForObject(requestEntity, BookResponseResource.class);
}

(1) Changer le type de contenu

Lors du changement de jeu de caractères
public BookResponseResource getTestResponse(BookRequestResource request) {
    // (1)
    Map<String, String> prop = new HashMap<String, String>();
    prop.put("charset", "shift_jis");
    // (2)
    MediaType mediaType = new MediaType(MediaType.APPLICATION_XML, param);

    RequestEntity<BookRequestResource> requestEntity = 
        RequestEntity
          .post(new URI(URL))
          .contentType(mediaType)
          .body(request);

    return restTemplate.getForObject(requestEntity, BookResponseResource.class);
}

(1) Définissez la propriété (charset) de MediaType (2) Générer MediaType basé sur la propriété

"Kihon"

Gérer les erreurs à la destination de la communication

public TestResponseResource getTestResponse() {
    // (1)
    try {
        return restTemplate.getForObject(URL, TestResponseResource.class);
    }
    catch (HttpClientErrorException e) { // (1)
        logger.error("Une erreur de la série 400 s'est produite");
        throw e;
    }
    catch (HttpServerErrorException e) { // (2)
        logger.error("Une erreur de la série 500 s'est produite");
        throw e;
    }
}

(1) Se produit lorsque le code HttpStatus de la réponse est 400 series. (2) Se produit lorsque le code HttpStatus de la réponse est série 500.

Recommended Posts

Utilisez le modèle de repos Gekitsuyo pour la communication REST
[RubyOnRails] Pour quel type de données active_hash doit-il être utilisé?
Map keySet, les valeurs ne doivent pas être utilisées
[Java] Quand var doit être utilisé et quand il ne doit pas être utilisé
Introduction de jQuery-jusqu'à ce qu'il puisse être utilisé (enregistrement exécuté en préparation pour une communication asynchrone) haml