En guide til unirest

1. Oversigt

Unirest er et let HTTP-klientbibliotek fra Mashape. Sammen med Java er den også tilgængelig til Node.js, .Net, Python, Ruby osv.

Før vi hopper ind, skal du bemærke, at vi bruger mocky.io til alle vores HTTP-anmodninger her.

2. Maven-opsætning

For at komme i gang, lad os først tilføje de nødvendige afhængigheder:

 com.mashape.unirest unirest-java 1.4.9 

Tjek den seneste version her.

3. Enkle anmodninger

Lad os sende en simpel HTTP-anmodning for at forstå semantikken i rammen:

@Test offentlig ugyldighed 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 ()); }

Bemærk, at API'en er flydende, effektiv og ret let at læse.

Vi sender overskrifter og parametre med header() og felter() API'er.

Og anmodningen påberåbes på asJson () metodeopkald; vi har også andre muligheder her, såsom asBinary (), asString () og asObject ().

For at videregive flere overskrifter eller felter kan vi oprette et kort og videresende dem til .headers (Map headers) og .felter (kortfelter) henholdsvis:

@Test offentlig ugyldighed skalReturnStatusAccepted () {Map headers = new HashMap (); headers.put ("accept", "application / json"); headers.put ("Autorisation", "Bærer 5a9ce37b3100004f00ab5154"); Kortfelter = nyt HashMap (); fields.put ("navn", "Sam Baeldung"); fields.put ("id", "PSP123"); HttpResponse jsonResponse = Unirest.put ("// www.mocky.io/v2/5a9ce7853100002a00ab515e"). Overskrifter (overskrifter). Felter (felter) .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (202, jsonResponse.getStatus ()); }

3.1. Bestået forespørgselsparametre

At videregive data som en forespørgsel Snor, vi bruger queryString () metode:

HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154") .queryString ("apiKey", "123")

3.2. Brug af Path Params

Til at overføre alle URL-parametre kan vi bruge ruteParam () metode:

HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}") .routeParam ("userId", "123")

Parameterens pladsholdernavn skal være det samme som det første argument for metoden.

3.3. Anmodninger med krop

Hvis vores anmodning kræver en streng / JSON-krop, sender vi den ved hjælp af legeme() metode:

@Test offentlig ugyldighed givenRequestBodyWhenCreatedThenCorrect () {HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d") .body ("{\" name \ ": \" Sam Baeldung \ ", \" city \ ": \" viena \ "}") .asJson (); assertEquals (201, jsonResponse.getStatus ()); }

3.4. Objektkort

For at bruge asObject () eller legeme() i anmodningen skal vi definere vores objektmapper. For at gøre det nemmere bruger vi Jackson-objektmapperen.

Lad os først tilføje følgende afhængigheder til pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.9.4 

Brug altid den nyeste version over på Maven Central.

Lad os nu konfigurere vores kortlægger:

Unirest.setObjectMapper (ny ObjectMapper () {com.fasterxml.jackson.databind.ObjectMapper mapper = ny com.fasterxml.jackson.databind.ObjectMapper (); offentlig String writeValue (Objektværdi) {return mapper.writeValueAsString (værdi);} public T readValue (String value, Class valueType) {return mapper.readValue (value, valueType);}});

Noter det setObjectMapper () skal kun kaldes en gang for at indstille kortlæggeren; når kortlæggerinstansen er indstillet, bruges den til alle anmodninger og svar.

Lad os nu teste den nye funktionalitet ved hjælp af en brugerdefineret Artikel objekt:

@Test offentligt ugyldigt givetArticleWhenCreatedThenCorrect () {Article article = new Article ("ID1213", "Guide to Rest", "baeldung"); HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d"). Krop (artikel) .asJson (); assertEquals (201, jsonResponse.getStatus ()); }

4. Anmodningsmetoder

I lighed med enhver HTTP-klient giver rammen separate metoder til hvert HTTP-verb:

STOLPE:

Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d")

SÆTTE:

Unirest.put ("// www.mocky.io/v2/5a9ce7663100006800ab515d")

FÅ:

Unirest.get ("// www.mocky.io/v2/5a9ce7663100006800ab515d")

SLET:

Unirest.delete ("// www.mocky.io/v2/5a9ce7663100006800ab515d")

LAPPE:

Unirest.patch ("// www.mocky.io/v2/5a9ce7663100006800ab515d")

MULIGHEDER:

Unirest.options ("// www.mocky.io/v2/5a9ce7663100006800ab515d")

5. Svarmetoder

Når vi har fået svaret, lad os kontrollere statuskoden og statusmeddelelsen:

// ... jsonResponse.getStatus () // ...

Uddrag headerne:

// ... jsonResponse.getHeaders (); // ...

Få svarorganet:

// ... jsonResponse.getBody (); jsonResponse.getRawBody (); // ...

Bemærk, at getRawBody (), returnerer en strøm af det uparsede responsorgan, mens getBody () returnerer den parsede krop ved hjælp af objektmapperen, der er defineret i det tidligere afsnit.

6. Håndtering af asynkrone anmodninger

Unirest har også evnen til at håndtere asynkrone anmodninger - ved hjælp af java.util.concurrent.Future og tilbagekaldsmetoder:

@Test offentlig ugyldig nårAysncRequestShouldReturnOk () {Future fremtid = Unirest.post ("//www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms"). header ("accept", "application / json") .asJsonAsync (ny tilbagekald () {offentlig ugyldighed mislykkedes (UnirestException e) {// Gør noget, hvis anmodningen mislykkedes} offentlig ugyldighed afsluttet (HttpResponse-svar) {// Gør noget, hvis anmodningen lykkes} offentlig ugyldighed annulleret () {// Gør noget, hvis anmodningen annulleres}}) ; assertEquals (200, future.get (). getStatus ()); }

Det com.mashape.unirest.http.async.Callback interface giver tre metoder, mislykkedes(), annulleret() og afsluttet ().

Tilsidesæt metoderne til at udføre de nødvendige operationer afhængigt af svaret.

7. Filoverførsler

Hvis du vil uploade eller sende en fil som en del af anmodningen, skal du sende en java.io-fil objekt som et felt med navnefil:

@Test offentlig ugyldighed 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å bruge ByteStream:

@Test offentlig ugyldighed givenByteStreamWhenUploadedThenCorrect () {prøv (InputStream inputStream = ny FileInputStream (ny fil ("/ sti / til / fil / artcile.txt"))) {byte [] bytes = ny byte [inputStream.available ()]; inputStream.read (bytes); HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d") .field ("fil", bytes, "article.txt") .asJson (); assertEquals (201, jsonResponse.getStatus ()); }}

Eller brug inputstrømmen direkte ved at tilføje ContentType.APPLICATION_OCTET_STREAM som det andet argument i felter() metode:

@Test offentlig ugyldighed givenInputStreamWhenUploadedThenCorrect () {prøv (InputStream inputStream = ny FileInputStream (ny fil ("/ sti / til / fil / artcile.txt"))) {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io / v2 / 5a9ce7663100006800ab515d ") .field (" fil ", inputStream, ContentType.APPLICATION_OCTET_STREAM," article.txt "). asJson (); assertEquals (201, jsonResponse.getStatus ()); }}

8. Unirest-konfigurationer

Rammen understøtter også typiske konfigurationer af en HTTP-klient som forbindelsespooling, timeouts, globale headere osv.

Lad os indstille antallet af forbindelser og antallet maksimale forbindelser pr. Rute:

Unirest.setConcurrency (20, 5);

Konfigurer timeout for forbindelse og stik:

Unirest.setTimeouts (20000, 15000);

Bemærk, at tidsværdierne er i millisekunder.

Lad os nu indstille HTTP-overskrifter til alle vores anmodninger:

Unirest.setDefaultHeader ("X-app-navn", "baeldung-unirest"); Unirest.setDefaultHeader ("X-anmodning-id", "100004f00ab5");

Vi kan rydde de globale overskrifter når som helst:

Unirest.clearDefaultHeaders ();

På et eller andet tidspunkt er vi muligvis nødt til at fremsætte anmodninger via en proxyserver:

Unirest.setProxy (ny HttpHost ("localhost", 8080));

Et vigtigt aspekt at være opmærksom på er at lukke eller afslutte applikationen yndefuldt. Unirest gyder en baggrundshændelsessløjfe til at håndtere operationerne, vi skal lukke den sløjfe, inden vi afslutter vores ansøgning:

Unirest.shutdown ();

9. Konklusion

I denne vejledning fokuserede vi på den lette HTTP-klientramme - Unirest. Vi arbejdede med nogle enkle eksempler, både i synkrone, men også asynkroniserede tilstande.

Endelig brugte vi også flere avancerede konfigurationer - såsom pooling af forbindelser, proxyindstillinger osv.

Som normalt er kildekoden tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found