(am Beispiel von Google Maps)
Im letzten Blog habe ich gezeigt wie einfach es mit Spring ist einen REST-Service zu erstellen. Aber auch das Konsumieren eines REST-Services als Client lässt sich in Spring elegant und einfach umsetzten.
Am Beispiel von Google Maps zeige ich wie es funktioniert.
Spring bietet hierfür die Klasse org.springframework.web.client.RestTemplate an. Das folgende Code-Snippet zeigt die einfache Nutzung der RestTemplate-Klasse. Die Methode getForObject erwartet im ersten Parameter die Request-URL des REST-Services. Der zweite Parameter legt fest, in welche Klasse die Antwort gebunden werden soll. Im ersten Beispiel verwenden wir String.
@Test public void testGoogleMaps() { RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject( "http://maps.googleapis.com/maps/api/geocode/json?address=" + "Willy-Brandt-Straße 1, 10557, Berlin" + "&sensor=false", String.class); System.out.println(response); Assert.assertNotNull(response);
Wir erhalten folgende JSON-Antwort:
{ "results" : [ { "address_components" : [ { "long_name" : "1", "short_name" : "1", "types" : [ "street_number" ] }, { "long_name" : "Willy-Brandt-Straße", "short_name" : "Willy-Brandt-Straße", "types" : [ "route" ] }, ... "geometry" : { "location" : { "lat" : 52.51985999999999, "lng" : 13.37028 }, ...
Der erste REST-Client funktioniert wie erwartet! Da wir die JSON-Antwort aber nicht selbst parsen wollen, müssen wir diese Aufgabe an Spring delegieren. Zum Mappen der Antwort benötigen wir simple Java-Beans, die wir mit @JsonProperty(„foo“) annotieren. Die Annotation wird vom Jackson-Mapper Framework bereitgestellt und definiert die Attribute, welche in die angegeben Member-Variablen der Bean gebunden werden soll.
JSON-Antwort:
{ "results" : [ { "address_components" : [...], "status" : "OK" }
Binding-Object:
@JsonIgnoreProperties(ignoreUnknown = true) public class GEORespone { @JsonProperty("status") private String status; @JsonProperty("results") private AdressDetail[] results; public String getStatus() {...} public AdressDetail[] getResults() {...} }
Das folgende Code-Snippet zeigt, wie die Antwort des Google Services in die annotierte Java-Bean GEOResponse automatisch gebunden wird.
@Test public void testGoogleMapsMappedResponse() { RestTemplate restTemplate = new RestTemplate(); GEORespone response = restTemplate.getForObject( "http://maps.googleapis.com/maps/api/geocode/json?address=" + "Willy-Brandt-Straße 1, 10557, Berlin" + "&sensor=false", GEORespone.class); Assert.assertNotNull(response); }
Das vollständige Maven-Projekt finden Sie hier rest-service-2.zip
Neugierig geworden? Sprechen Sie mich an, wenn Sie effektiver Ihre Entwicklungsabteilung aufstellen wollen.