5. tavaszi webkliens

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk a Web Ügyfél, amely az 5. tavasszal bevezetett reaktív webes kliens.

Meg fogjuk nézni a WebTestClient, a Web Ügyfél tesztekben való felhasználásra tervezték.

2. Mi az Web Ügyfél?

Egyszerűen fogalmazva, Web Ügyfél olyan felület, amely a webes kérések végrehajtásának fő belépési pontját képviseli.

A Spring Web Reactive modul részeként jött létre, és a klasszikus helyébe lép RestTemplate ezekben a forgatókönyvekben. Ezenkívül az új kliens egy reaktív, nem blokkoló megoldás, amely a HTTP / 1.1 protokollon keresztül működik.

Végül az interfésznek egyetlen megvalósítása van, a DefaultWebClient osztály, amellyel együtt fogunk dolgozni.

3. Függőségek

Mivel Spring Boot alkalmazást használunk, szükségünk van a spring-boot-starter-webflux a függőség, valamint a Reactor projekt.

3.1. Építés Mavennel

Adjuk hozzá a következő függőségeket a pom.xml fájl:

 org.springframework.boot spring-boot-starter-webflux org.projectreactor reaktor-rugó 1.0.1. 

3.2. Épület Gradle-vel

A Gradle alkalmazással a következő bejegyzéseket kell hozzáadnunk a épít.gradle fájl:

függőségek {compile 'org.springframework.boot: spring-boot-starter-webflux' compile 'org.projectreactor: reaktor-spring: 1.0.1.RELEASE'}

4. Munka a Web Ügyfél

Ahhoz, hogy megfelelően működjünk együtt az ügyféllel, tudnunk kell, hogyan:

  • létrehoz egy példányt
  • kérelmezni
  • kezelje a választ

4.1. A. Létrehozása Web Ügyfél Példa

Három lehetőség közül lehet választani. Az első a Web Ügyfél objektum alapértelmezett beállításokkal:

WebClient client1 = WebClient.create (); 

A második lehetőség az a Web Ügyfél adott alap URI-val:

WebClient client2 = WebClient.create ("// localhost: 8080"); 

A harmadik (és a legfejlettebb) lehetőség az ügyfél létrehozása a DefaultWebClientBuilder osztály, amely teljes testreszabást tesz lehetővé:

WebClient client3 = WebClient .builder () .baseUrl ("// localhost: 8080") .defaultCookie ("cookieKey", "cookieValue") .defaultHeader (HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE (( "," // localhost: 8080 ")) .build ();

4.2. A. Létrehozása Web Ügyfél Példány Időkorlátokkal

Gyakran az alapértelmezett 30 másodperces HTTP-időtúllépés túl lassú az igényeinkhez, ezért nézzük meg, hogyan konfigurálhatjuk őket a Web Ügyfél példa.

Az általunk használt alaposztály az TcpClient.

Ott tudunk állítsa be a kapcsolat időtúllépését a ChannelOption.CONNECT_TIMEOUT_MILLIS érték. Azt is megtehetjük állítsa be az írás és olvasás időkorlátját a használatával ReadTimeoutHandler és a WriteTimeoutHandler, illetve:

TcpClient tcpClient = TcpClient .create () .option (ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .doOnConnected (kapcsolat -> {kapcsolat.addHandlerLast (új ReadTimeoutHandler (5000, TimeUnit.MILLISECONd (újrakész (újrakész) (újrakész (új) (kapcsolat MILLISZekundum));}); WebClient kliens = WebClient.builder () .clientConnector (új ReactorClientHttpConnector (HttpClient.from (tcpClient))) .build ();

Vegye figyelembe, hogy amíg hívhatunk időtúllépés kliens kérésünkre is ez egy jel időtúllépés, nem HTTP kapcsolat, vagy olvasási / írási időtúllépés; ez időtúllépés a Mono / Flux kiadó számára.

4.3. Kérelem előkészítése

Először meg kell határoznunk egy kérés HTTP metódusát meghívással módszer (HttpMethod módszer) vagy meghívjuk a parancsikonjait, mint pl kap, post, és töröl:

WebClient.UriSpec request1 = client3.method (HttpMethod.POST); WebClient.UriSpec request2 = client3.post ();

A következő lépés egy URL megadása. Átadhatjuk a uri API mint a Húr vagy a java.net.URL példa:

WebClient.RequestBodySpec uri1 = ügyfél3 .metódus (HttpMethod.POST) .uri ("/ erőforrás"); WebClient.RequestBodySpec uri2 = client3 .post () .uri (URI.create ("/ erőforrás"));

Ezután beállíthatunk egy kérés törzsét, tartalom típusát, hosszát, sütiket vagy fejléceket, ha szükséges.

Például, ha egy kéréstestet akarunk beállítani, kétféle módszer áll rendelkezésre: kitöltése a-val BodyInserter vagy ezt a munkát átruházni a Kiadó:

WebClient.RequestHeadersSpec requestSpec1 = WebClient .create () .metód (HttpMethod.POST) .uri ("/ erőforrás") .body (BodyInserters.fromPublisher (Mono.just ("adatok")), String.osztály); WebClient.RequestHeadersSpec requestSpec2 = WebClient .create ("// localhost: 8080") .post () .uri (URI.create ("/ erőforrás")) .body (BodyInserters.fromObject ("adatok"));

A BodyInserter olyan interfész, amely felelős az a ReactiveHttpOutputMessage törzs egy adott kimeneti üzenettel és a beszúrás során használt kontextussal. A Kiadó reaktív komponens, amely felelős a potenciálisan korlátlan számú szekvenált elem biztosításáért.

A második út a test metódus, amely az eredeti parancsikonja test (BodyInserter beillesztés) módszer.

A töltési folyamat enyhítése érdekében a BodyInserter, van egy BodyInserters osztály számos hasznos használati módszerrel:

BodyInserter inserter1 = BodyInserters .fromPublisher (Subscriber :: onComplete, String.class); 

Lehetséges a-val is MultiValueMap:

LinkedMultiValueMap map = új LinkedMultiValueMap (); map.add ("kulcs1", "érték1"); map.add ("kulcs2", "érték2"); BodyInserter inserter2 = BodyInserters.fromMultipartData (térkép); 

Vagy egyetlen objektum használatával:

BodyInserter inserter3 = BodyInserters.fromObject (new Object ()); 

A törzs beállítása után beállíthatunk fejléceket, cookie-kat és elfogadható médiatípusokat. Az értékek hozzáadódnak azokhoz, amelyeket már beállítottak az ügyfél példányosítása során.

Ezenkívül további támogatást nyújt a leggyakrabban használt fejlécek, például „If-None-Match”, „If-Modified-Since”, „Accept”, és „Accept-Charset”.

Íme egy példa ezeknek az értékeknek a felhasználására:

WebClient.ResponseSpec response1 = uri1 .body (inserter3). Header (HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .accept (MediaType.APPLICATION_JSON, MediaType.APPLICATION_XMLFájl (8) "*") .ifModifiedSince (ZonedDateTime.now ()) .retrieve ();

4.4. Válasz megszerzése

Az utolsó szakasz a kérelem elküldése és a válasz fogadása. Ez megtehető akár a csere vagy a visszahoz módszer.

Ezek a módszerek visszatérési típusonként különböznek egymástól; a csere módszer biztosítja a ClientResponse állapotával és fejléceivel együtt, míg a visszahoz A módszer a legrövidebb út a test közvetlen lekéréséhez:

Karakterlánc-válasz2 = request1.exchange () .block () .bodyToMono (String.osztály) .block (); Karakterlánc-válasz3 = kérés2 .retrieve () .bodyToMono (String.osztály) .block ();

Fontos figyelni a bodyToMono módszer, amely a WebClientException ha az állapotkód az 4xx (kliens hiba) vagy 5xx (szerver hiba). Használjuk a Blokk módszer be Monós feliratkozni és visszakeresni a válaszsal elküldött tényleges adatokat.

5. Munka a WebTestClient

A WebTestClient a fő belépési pont a WebFlux szerver végpontok teszteléséhez. Nagyon hasonló API-val rendelkezik, mint az Web Ügyfél, és a munka nagy részét egy belsőre delegálja Web Ügyfél főleg a tesztkörnyezet biztosítására összpontosítva. A DefaultWebTestClient osztály egyetlen interfész megvalósítás.

A teszteléshez szükséges kliens valós szerverhez köthető, vagy meghatározott vezérlőkkel vagy funkciókkal dolgozhat.

5.1. Kötés szerverhez

A végpontok közötti integrációs tesztek tényleges kérésekkel történő teljesítéséhez egy futó szerverre használhatjuk a bindToServer módszer:

WebTestClient testClient = WebTestClient .bindToServer () .baseUrl ("// localhost: 8080") .build (); 

5.2. Kötés routerhez

Tesztelhetünk egy adottat RouterFunction átadva a bindToRouterFunction módszer:

RouterFunction function = RouterFunctions.route (RequestPredicates.GET ("/ erőforrás"), kérés -> ServerResponse.ok (). Build ()); WebTestClient .bindToRouterFunction (function) .build (). Get (). Uri ("/ erőforrás") .exchange () .expectStatus (). IsOk () .expectBody (). IsEmpty (); 

5.3. Kötés egy webkezelőhöz

Ugyanez a viselkedés érhető el a bindToWebHandler módszer, amely a Webkezelő példa:

WebHandler kezelő = csere -> Mono.empty (); WebTestClient.bindToWebHandler (kezelő) .build ();

5.4. Kötés az alkalmazás kontextusához

Érdekesebb helyzet akkor fordul elő, amikor a bindToApplicationContext módszer. Annak kell ApplicationContext és elemzi a kontroll babok kontextusát és @EnableWebFlux konfigurációk.

Ha beadunk egy példányt a ApplicationContext, egy egyszerű kódrészlet így nézhet ki:

@Autowired private ApplicationContext kontextus; WebTestClient testClient = WebTestClient.bindToApplicationContext (context) .build (); 

5.5. Kötés a vezérlőhöz

Rövidebb megközelítés egy olyan vezérlő tömb biztosítását jelentené, amelyet a bindToController módszer. Feltéve, hogy van egy Vezérlő osztályba, és beadtuk egy szükséges osztályba, írhatunk:

@ Hivatalos privát vezérlő vezérlő; WebTestClient testClient = WebTestClient.bindToController (vezérlő) .build (); 

5.6. Kérni

Miután megépítette a WebTestClient objektum, az összes következő művelet a láncban hasonló lesz a Web Ügyfél amíg a csere módszer (a válasz elérésének egyik módja), amely biztosítja a WebTestClient.ResponseSpec felület olyan hasznos módszerekkel dolgozni, mint a várhatóStatus, várhatóBody, és várhatóHeader:

WebTestClient .bindToServer () .baseUrl ("// localhost: 8080") .build () .post () .uri ("/ erőforrás") .exchange () .expectStatus (). IsCreated () .expectHeader (). ValueEquals ("Tartalom-típus", "alkalmazás / json") .expectBody (). IsEmpty (); 

6. Következtetés

Ebben a cikkben feltártuk a WebClient, egy új, továbbfejlesztett tavaszi mechanizmus az ügyféloldali kérések benyújtására.

Megvizsgáltuk az általa nyújtott előnyöket az ügyfél konfigurálásával, a kérés előkészítésével és a válasz feldolgozásával is.

A cikkben említett összes kódrészlet megtalálható a GitHub-adattárunkban.