RestTemplate
RestTemplate ist eine Klasse, die Methoden zum Aufrufen der REST-API (Web-API) bereitstellt. Von Spring Framework bereitgestellter HTTP-Client (Wrapping von HttpClient).
Zusammenfassend eine praktische Komponente, die eine einfache REST-Kommunikation ermöglicht.
Es konvertiert das DTO in eine Anforderung im Json-Format und bindet die Antwort im Json-Format an das DTO. Zusätzlich zu Json werden verschiedene Datenformate wie Xml und Form unterstützt und können angepasst werden !!
DTO => Json
DTO
@Getter // (1)
@Setter // (1)
public class SomeRequestResource {
private String message; // (2)
}
(1) Getter und Setter werden automatisch mit der Bibliothek "Lombock" generiert (2) Felder, die die spätere Json-Konvertierung widerspiegeln
Json
{
"messsage": "test message"
}
DTO-Feldnamen und -Werte werden in das Json-Format konvertiert
Json => DTO
Json
{
"messsage": "test message"
}
DTO
@Getter
@Setter
public class SomeRequestResource {
private String message; // (1)
}
(1) Feld, an das der Wert von Json gebunden ist
@Service
public class XxxxServiceImpl implements XxxxService {
@Autowired
RestTemplate restTemplate;
// ...
}
Injizieren Sie diesmal die Haupt-Restvorlage. Diese "Restvorlage" enthält Teile, die für die REST-Kommunikation verwendet werden.
@Getter
@Setter
public class TestResponseResource {
private String id; // (1)
private String message; // (1)
}
(1) Feld zum Binden der Antwort
@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) Senden Sie GET. (1) Argument von "getForObject"
Argumentreihenfolge | Schimmel | Erläuterung |
---|---|---|
1 | String |
Ziel-URL |
2 | Class<T> |
Vom Ziel zurückgekehrtResponseBody Klasse zum Binden |
@Getter
@Setter
public class TestRequestResource {
private String message; // (1)
}
(1) Zu sendender Wert
@Getter
@Setter
public class TestResponseResource {
private String id; // (1)
private String message; // (1)
}
(1) Feld zum Binden der Antwort
@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) Stellen Sie die Übertragungsdaten ein (2) POST-Übertragung (2) Argument von "postForObject"
Argumentreihenfolge | Schimmel | Erläuterung |
---|---|---|
1 | String |
Ziel-URL |
2 | Object |
Zu sendender Wert |
3 | Class<T> |
Vom Ziel zurückgekehrtResponseBody Klasse zum Binden |
Im Fall der REST-Kommunikation kann die ID-Information der Ressource von der URL abgerufen werden.
Beispiel) http: // com.example.rest / book / 1
Im Fall von "RestTemplate" kann es in mehreren Mustern implementiert werden.
PathParameter
Klauenmuster@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) Parameter sind an {id}
gebunden
(2) Übergeben Sie die Zeichenfolge, die Sie an den Parameter binden möchten, am Ende des Arguments. Da es mit einem Argument variabler Länge verwendet wird, können mehrere Spezifikationen angegeben werden.
@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) Parameter sind an {id}
gebunden
(2) Stellen Sie den Wert ein, der an den Parameter gebunden werden soll
(2) Übergeben Sie die Map <String, String>
des Werts, den Sie an den Parameter am Ende des Arguments binden möchten.
Sie kann flexibel geändert werden, wenn das zu sendende Datenformat geändert wird, z. B. XML, wenn der Zeichencode geändert wird oder wenn Sie einen speziellen Header senden möchten.
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) Ändern Sie den Inhaltstyp
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) Legen Sie die Eigenschaft (charset
) von MediaType
fest
(2) Generieren Sie "MediaType" basierend auf der Eigenschaft
public TestResponseResource getTestResponse() {
// (1)
try {
return restTemplate.getForObject(URL, TestResponseResource.class);
}
catch (HttpClientErrorException e) { // (1)
logger.error("400 Serienfehler aufgetreten");
throw e;
}
catch (HttpServerErrorException e) { // (2)
logger.error("500 Serienfehler aufgetreten");
throw e;
}
}
(1) Tritt auf, wenn der HttpStatus-Code der Antwort 400-Serie ist. (2) Tritt auf, wenn der HttpStatus-Code der Antwort 500-Serie ist.
Recommended Posts