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.