A RestTemplate útmutatója

1. Áttekintés

Ebben az oktatóanyagban a műveletek széles körét mutatjuk be, ahol a Spring REST Client - RestTemplate - használható, és jól használható.

Az összes példa API oldalán itt fogjuk futtatni a RESTful szolgáltatást.

2. Az elévülésről szóló értesítés

A Spring Framework 5-től kezdve a WebFlux-verem mellett a Spring bemutatott egy új HTTP-klienst Web Ügyfél.

Web Ügyfél egy modern, alternatív HTTP kliens a RestTemplate. Nemcsak hagyományos szinkron API-t biztosít, hanem hatékony, blokkolás nélküli és aszinkron megközelítést is.

Ez azt jelenti, hogy ha új alkalmazásokat fejlesztünk vagy egy régit telepítünk át, jó ötlet használni Web Ügyfél. Haladni előre, RestTemplate a következő verziókban megszűnik.

3. Használja a GET-et az erőforrások lekéréséhez

3.1. Get Plain JSON

Kezdjük egyszerûen, és beszéljünk a GET-kérésekrõl egy gyors példa a getForEntity () API:

RestTemplate restTemplate = új RestTemplate (); String fooResourceUrl = "// localhost: 8080 / spring-rest / foos"; ResponseEntity response = restTemplate.getForEntity (fooResourceUrl + "/ 1", String.class); assertThat (válasz.getStatusCode (), egyenlőTo (HttpStatus.OK));

Figyelje meg, hogy teljes hozzáféréssel rendelkezünk a HTTP válaszhoz, így megtehetjük például az állapotkód ellenőrzését, hogy megbizonyosodjunk arról, hogy a művelet sikeres volt-e, vagy működhetünk a válasz tényleges törzsével:

ObjectMapper mapper = új ObjectMapper (); JsonNode gyökér = mapper.readTree (response.getBody ()); JsonNode név = root.path ("név"); assertThat (név.asText (), notNullValue ());

Itt a választesttel szokásos karakterláncként dolgozunk, és Jackson (és a JSON csomópontstruktúra, amelyet Jackson nyújt) segítségével ellenőrizzük néhány részletet.

3.2. POJO lekérése JSON helyett

A választ közvetlenül is leképezhetjük egy erőforrás DTO-ra:

a Foo nyilvános osztály Serializable {private long id; privát karakterlánc neve; // szabványos mérőeszközök és beállítók}

Most egyszerűen használhatjuk a getForObject API a sablonban:

Foo foo = restTemplate .getForObject (fooResourceUrl + "/ 1", Foo.class); assertThat (foo.getName (), notNullValue ()); assertThat (foo.getId (), (1 L));

4. Használja a HEAD elemet a fejlécek lekéréséhez

Most nézzük meg gyorsan a HEAD alkalmazását, mielőtt továbblépnénk a gyakoribb módszerekre.

Használni fogjuk a headForHeaders () API itt:

HttpHeaders httpHeaders = restTemplate.headForHeaders (fooResourceUrl); assertTrue (httpHeaders.getContentType (). tartalmazza (MediaType.APPLICATION_JSON));

5. A POST segítségével hozzon létre egy erőforrást

Új erőforrás létrehozása érdekében az API-ban jól ki tudjuk használni a postForLocation (), postForObject () vagy postForEntity () API-k.

Az első az újonnan létrehozott erőforrás URI-ját adja vissza, míg a második magát az erőforrást adja vissza.

5.1. A postForObject () API

RestTemplate restTemplate = új RestTemplate (); HttpEntity request = new HttpEntity (new Foo ("bar")); Foo foo = restTemplate.postForObject (fooResourceUrl, request, Foo.class); assertThat (foo, notNullValue ()); assertThat (foo.getName (), is ("sáv"));

5.2. A postForLocation () API

Hasonlóképpen nézzük meg azt a műveletet, amely a teljes erőforrás visszaadása helyett csak a Elhelyezkedés az újonnan létrehozott erőforrás:

HttpEntity request = new HttpEntity (new Foo ("bar")); URI hely = restTemplate .postForLocation (fooResourceUrl, kérés); assertThat (hely, nemNullValue ());

5.3. A csere() API

Nézzük meg, hogyan lehet POST-ot csinálni az általánosabbal csere API:

RestTemplate restTemplate = új RestTemplate (); HttpEntity request = new HttpEntity (new Foo ("bar")); ResponseEntity response = restTemplate .exchange (fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat (response.getStatusCode (), (HttpStatus.CREATED)); Foo foo = response.getBody (); assertThat (foo, notNullValue ()); assertThat (foo.getName (), is ("sáv")); 

5.4. Űrlapadatok benyújtása

Ezután nézzük meg, hogyan lehet űrlapot beküldeni a POST módszer segítségével.

Először be kell állítanunk a Tartalom típus fejléc application / x-www-form-urlencoded.

Ez biztosítja, hogy egy nagyméretű lekérdezési karakterláncot el lehet küldeni a kiszolgálónak, névvel és értékpárral elválasztva &:

HttpHeaders fejlécek = new HttpHeaders (); header.setContentType (MediaType.APPLICATION_FORM_URLENCODED);

A formaváltozókat a-ba csomagolhatjuk LinkedMultiValueMap:

MultiValueMap map = new LinkedMultiValueMap (); map.add ("id", "1");

Következő, a Request-et egy HttpEntity példa:

HttpEntity kérelem = új HttpEntity (térkép, fejlécek);

Végül hívással csatlakozhatunk a REST szolgáltatáshoz restTemplate.postForEntity () a végponton: /foos/forma

ResponseEntity response = restTemplate.postForEntity (fooResourceUrl + "/ form", request, String.class); assertThat (response.getStatusCode (), (HttpStatus.CREATED));

6. Használja az OPTIONS lehetőséget az engedélyezett műveletek megszerzéséhez

Ezután gyorsan megnézzük az OPTIONS kérés használatát, és egy ilyen URI használatával feltárjuk egy adott URI engedélyezett műveleteit; az API az optionsForAllow:

Set optionsForAllow = restTemplate.optionsForAllow (fooResourceUrl); HttpMethod [] támogatottMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE}; assertTrue (optionsForAllow.containsAll (tömbök.asList (támogatottMetódok)));

7. A PUT segítségével frissítse az erőforrást

Ezután elkezdjük vizsgálni a PUT-ot és pontosabban a csere() API ehhez a művelethez, mivel a template.put Az API meglehetősen egyszerű.

7.1. Egyszerű PUT Val vel csere()

Egy egyszerű PUT művelettel kezdjük az API-t - és ne feledje, hogy a művelet nem ad vissza egy törzset az ügyfélnek:

Foo updatedInstance = new Foo ("újNév"); updatedInstance.setId (createResponse.getBody (). getId ()); String resourceUrl = fooResourceUrl + '/' + createResponse.getBody (). GetId (); HttpEntity requestUpdate = új HttpEntity (updatedInstance, fejlécek); template.exchange (resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);

7.2. PUT With csere() és egy Visszahívás kérése

Ezután egy visszahívási kérelmet fogunk használni egy PUT kiadásához.

Ügyeljünk arra, hogy előkészítsük a visszahívást, ahol beállíthatjuk az összes szükséges fejlécet, valamint egy kéréstestet:

RequestCallback requestCallback (végső Foo updatedInstance) {return clientHttpRequest -> {ObjectMapper mapper = új ObjectMapper (); mapper.writeValue (clientHttpRequest.getBody (), updatedInstance); clientHttpRequest.getHeaders (). add (HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); clientHttpRequest.getHeaders (). add (HttpHeaders.AUTHORIZATION, "Basic" + getBase64EncodedLogPass ()); }; }

Ezután létrehozzuk az erőforrást POST kéréssel:

ResponseEntity response = restTemplate .exchange (fooResourceUrl, HttpMethod.POST, request, Foo.class); assertThat (response.getStatusCode (), (HttpStatus.CREATED));

Ezután frissítjük az erőforrást:

Foo updatedInstance = new Foo ("újNév"); updatedInstance.setId (response.getBody (). getId ()); String resourceUrl = fooResourceUrl + '/' + response.getBody (). GetId (); restTemplate.execute (resourceUrl, HttpMethod.PUT, requestCallback (updatedInstance), clientHttpResponse -> null);

8. Az erőforrás eltávolításához használja a DELETE billentyűt

Meglévő erőforrás eltávolításához gyorsan felhasználjuk a töröl() API:

Karakterlánc entitásUrl = fooResourceUrl + "/" + existingResource.getId (); restTemplate.delete (entitásUrl); 

9. Konfigurálja az Időkorlátot

Konfigurálhatjuk RestTemplate hogy egyszerűen használjuk az időt ClientHttpRequestFactory:

RestTemplate restTemplate = new RestTemplate (getClientHttpRequestFactory ()); privát ClientHttpRequestFactory getClientHttpRequestFactory () {int timeout = 5000; HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory (); clientHttpRequestFactory.setConnectTimeout (timeout); return clientHttpRequestFactory; }

És használhatjuk HttpClient további konfigurációs lehetőségekért:

privát ClientHttpRequestFactory getClientHttpRequestFactory () {int timeout = 5000; RequestConfig config = RequestConfig.custom () .setConnectTimeout (timeout) .setConnectionRequestTimeout (timeout) .setSocketTimeout (timeout) .build (); CloseableHttpClient kliens = HttpClientBuilder .create () .setDefaultRequestConfig (config) .build (); return new HttpComponentsClientHttpRequestFactory (kliens); }

10. Következtetés

Ebben a cikkben áttekintettük a fő HTTP igék használatát RestTemplate hogy a kéréseket mindezek felhasználásával hangszerelje.

Ha meg akarja találni a sablonnal történő hitelesítés módját, olvassa el az Alapvető hitelesítés a RestTemplate szolgáltatással című cikkünket.

Ezen példák és kódrészletek megvalósítása megtalálható a GitHub-on.