[JAVA] Gekitsuyo Rest Template sollte für die REST-Kommunikation verwendet werden

RestTemplate

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

Verwendung von "RestTemplate"

"Kihon" no Ki

Injektion vorerst

@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.

Versuchen Sie, GET zu senden

@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ückgekehrtResponseBodyKlasse zum Binden

Versuchen Sie, POST zu senden

@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ückgekehrtResponseBodyKlasse zum Binden

"Kihon"

Ändern Sie die sendende URL dynamisch

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.

In der Reihenfolge 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.

Explizites 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 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.

Ändern Sie die zu sendenden Header-Informationen

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.

Ändern Sie den Inhaltstyp

Bei Änderung nur 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

Beim Ändern des Zeichensatzes
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

"Kihon"

Behandeln Sie Fehler am Kommunikationsziel

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

Gekitsuyo Rest Template sollte für die REST-Kommunikation verwendet werden
[RubyOnRails] Für welche Art von Daten sollte active_hash verwendet werden?
Map keySet, Werte sollten nicht verwendet werden
[Java] Wann var verwendet werden soll und wann nicht
Einführung von jQuery - bis es verwendet werden kann (Datensatz zur Vorbereitung der asynchronen Kommunikation ausgeführt) haml