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
RestTemplate
@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.
@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 destinationResponseBody Classe à lier |
@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 destinationResponseBody Classe à lier |
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.
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.
@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.
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.
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
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é
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