En guide til unirest
1. Oversikt
Unirest er et lett HTTP-klientbibliotek fra Mashape. Sammen med Java er den også tilgjengelig for Node.js, .Net, Python, Ruby, etc.
Før vi hopper inn, vær oppmerksom på at vi bruker mocky.io for alle HTTP-forespørsler her.
2. Maven-oppsett
For å komme i gang, la oss først legge til de nødvendige avhengighetene:
com.mashape.unirest unirest-java 1.4.9
Sjekk ut den siste versjonen her.
3. Enkle forespørsler
La oss sende en enkel HTTP-forespørsel for å forstå semantikken i rammeverket:
@Test offentlig ugyldig skalReturnStatusOkay () {HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154") .header ("accept", "application / json"). QueryString ("apiKey", " 123 ") .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (200, jsonResponse.getStatus ()); }
Legg merke til at API er flytende, effektiv og ganske lett å lese.
Vi sender overskrifter og parametere med Overskrift() og Enger() APIer.
Og forespørselen blir påberopt på asJson () metode samtale; vi har også andre alternativer her, for eksempel asBinary (), asString () og asObject ().
For å passere flere overskrifter eller felt kan vi lage et kart og sende dem til .headers (Map headers) og .felt (kartfelt) henholdsvis:
@Test offentlig tomrom børReturnStatusAccepted () {Map headers = new HashMap (); headers.put ("godta", "applikasjon / json"); headers.put ("Autorisasjon", "Bearer 5a9ce37b3100004f00ab5154"); Kartfelt = nytt HashMap (); fields.put ("navn", "Sam Baeldung"); fields.put ("id", "PSP123"); HttpResponse jsonResponse = Unirest.put ("// www.mocky.io/v2/5a9ce7853100002a00ab515e"). Headers (headers) .fields (felt) .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (202, jsonResponse.getStatus ()); }
3.1. Bestått spørringsparameter
Å overføre data som et spørsmål Streng, vi bruker queryString () metode:
HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154") .queryString ("apiKey", "123")
3.2. Bruke Path Params
For å overføre eventuelle URL-parametere kan vi bruke routeParam () metode:
HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}") .routeParam ("userId", "123")
Parameterens plassholdernavn må være det samme som det første argumentet for metoden.
3.3. Forespørsler med kropp
Hvis forespørselen vår krever en streng / JSON-kropp, sender vi den ved hjelp av kropp() metode:
@Test offentlig ugyldig givenRequestBodyWhenCreatedThenCorrect () {HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d") .body ("{\" name \ ": \" Sam Baeldung \ ", \" city \ ": \" viena \ "}") .asJson (); assertEquals (201, jsonResponse.getStatus ()); }
3.4. Objektkartlegger
For å bruke asObject () eller kropp() i forespørselen må vi definere objektmapperen vår. For enkelhets skyld vil vi bruke Jackson-kartleggeren.
La oss først legge til følgende avhengigheter til pom.xml:
com.fasterxml.jackson.core jackson-databind 2.9.4
Bruk alltid den nyeste versjonen på Maven Central.
La oss nå konfigurere kartleggeren vår:
Unirest.setObjectMapper (new ObjectMapper () {com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper (); public String writeValue (Object value) {return mapper.writeValueAsString (value);} public T readValue (String value, Class valueType) {return mapper.readValue (value, valueType);}});
Noter det setObjectMapper () skal bare ringes en gang, for å sette kartleggeren; Når kartleggerinstansen er angitt, vil den brukes til alle forespørsler og svar.
La oss nå teste den nye funksjonaliteten ved hjelp av en tilpasset Artikkel gjenstand:
@Test offentlig ugyldighet gittArticleWhenCreatedThenCorrect () {Article article = new Article ("ID1213", "Guide to Rest", "baeldung"); HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d"). Kropp (artikkel) .asJson (); assertEquals (201, jsonResponse.getStatus ()); }
4. Be om metoder
I likhet med enhver HTTP-klient, gir rammeverket separate metoder for hvert HTTP-verb:
POST:
Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
SETTE:
Unirest.put ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
FÅ:
Unirest.get ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
SLETT:
Unirest.delete ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
LAPP:
Unirest.patch ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
ALTERNATIVER:
Unirest.options ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
5. Svarmetoder
Når vi har fått svaret, kan du sjekke statuskoden og statusmeldingen:
// ... jsonResponse.getStatus () // ...
Pakk ut topptekstene:
// ... jsonResponse.getHeaders (); // ...
Få svarorganet:
// ... jsonResponse.getBody (); jsonResponse.getRawBody (); // ...
Legg merke til at, getRawBody (), returnerer en strøm av det uparsede responsorganet, mens getBody () returnerer den analyserte kroppen, ved hjelp av objektmapperen som ble definert i den tidligere delen.
6. Håndtering av asynkrone forespørsler
Unirest har også muligheten til å håndtere asynkrone forespørsler - ved hjelp av java.util.concurrent.Future og tilbakeringingsmetoder:
@Test offentlig ugyldig nårAysncRequestShouldReturnOk () {Future fremtid = Unirest.post ("//www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms"). header ("godta", "applikasjon / json") .asJsonAsync (ny tilbakeringing () {offentlig ugyldighet mislyktes (UnirestException e) {// Gjør noe hvis forespørselen mislyktes} offentlig ugyldig fullført (HttpResponse-svar) {// Gjør noe hvis forespørselen er vellykket} offentlig ugyldig annullert () {// Gjør noe hvis forespørselen blir kansellert}}) ; assertEquals (200, future.get (). getStatus ()); }
De com.mashape.unirest.http.async.Callback grensesnittet gir tre metoder, mislyktes (), avbrutt() og fullført ().
Overstyr metodene for å utføre de nødvendige operasjonene avhengig av responsen.
7. Filopplastinger
For å laste opp eller sende en fil som en del av forespørselen, send inn en java.io. fil objekt som et felt med navnefil:
@Test offentlig ugyldig givenFileWhenUploadedThenCorrect () {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d") .field ("fil", ny fil ("/ sti / til / fil")). asJson (); assertEquals (201, jsonResponse.getStatus ()); }
Vi kan også bruke ByteStream:
@Test offentlig ugyldig givenByteStreamWhenUploadedThenCorrect () {try (InputStream inputStream = new FileInputStream (new File ("/ path / to / file / artcile.txt"))) {byte [] bytes = new byte [inputStream.available ()]; inputStream.read (byte); HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d") .field ("fil", byte, "article.txt") .asJson (); assertEquals (201, jsonResponse.getStatus ()); }}
Eller bruk inngangsstrømmen direkte, og legg til ContentType.APPLICATION_OCTET_STREAM som det andre argumentet i Enger() metode:
@Test offentlig ugyldig givenInputStreamWhenUploadedThenCorrect () {try (InputStream inputStream = new FileInputStream (new File ("/ path / to / file / artcile.txt"))) {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io / v2 / 5a9ce7663100006800ab515d ") .field (" file ", inputStream, ContentType.APPLICATION_OCTET_STREAM," article.txt "). asJson (); assertEquals (201, jsonResponse.getStatus ()); }}
8. Unirest-konfigurasjoner
Rammeverket støtter også typiske konfigurasjoner av en HTTP-klient som tilkoblingssamling, tidsavbrudd, globale overskrifter etc.
La oss angi antall tilkoblinger og antall maksimale forbindelser per rute:
Unirest.setConcurrency (20, 5);
Konfigurer tidsavbrudd for tilkobling og stikkontakt:
Unirest.setTimeouts (20000, 15000);
Merk at tidsverdiene er i millisekunder.
La oss nå sette HTTP-overskrifter for alle våre forespørsler:
Unirest.setDefaultHeader ("X-app-name", "baeldung-unirest"); Unirest.setDefaultHeader ("X-forespørsel-id", "100004f00ab5");
Vi kan fjerne globale overskrifter når som helst:
Unirest.clearDefaultHeaders ();
På et tidspunkt kan det hende at vi må komme med forespørsler via en proxy-server:
Unirest.setProxy (ny HttpHost ("localhost", 8080));
Et viktig aspekt å være klar over er å lukke eller avslutte søknaden. Unirest gyter en bakgrunnsbegivenhetssløyfe for å håndtere operasjonene. Vi må stenge den sløyfen før vi avslutter applikasjonen:
Unirest.shutdown ();
9. Konklusjon
I denne veiledningen fokuserte vi på det lette HTTP-klientrammeverket - Unirest. Vi jobbet med noen enkle eksempler, både i synkrone, men også asynkroniserte moduser.
Til slutt brukte vi også flere avanserte konfigurasjoner - for eksempel tilkoblingssamling, proxy-innstillinger etc.
Som vanlig er kildekoden tilgjengelig på GitHub.