Vodič za Unirest

1. Pregled

Unirest je lagana HTTP knjižnica klijenta tvrtke Mashape. Uz Java, dostupan je i za Node.js, .Net, Python, Ruby itd.

Prije nego što uskočimo, imajte na umu da ćemo za sve naše HTTP zahtjeve ovdje koristiti mocky.io.

2. Postavljanje Mavena

Za početak prvo dodamo potrebne ovisnosti:

 com.mashape.unirest unirest-java 1.4.9 

Ovdje pogledajte najnoviju verziju.

3. Jednostavni zahtjevi

Pošaljite jednostavni HTTP zahtjev, kako bismo razumjeli semantiku okvira:

@Test public void shouldReturnStatusOkay () {HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154") .header ("accept", "application / json"). QueryString ("apiKey" 123 ") .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (200, jsonResponse.getStatus ()); }

Primijetite da je API tečan, učinkovit i prilično jednostavan za čitanje.

Prosljeđujemo zaglavlja i parametre s Zaglavlje() i polja () Apis.

I zahtjev se poziva na asJson () poziv metode; ovdje imamo i druge mogućnosti, poput asBinary (), asString () i asObject ().

Da bismo proslijedili više zaglavlja ili polja, možemo stvoriti kartu i proslijediti ih .headers (zaglavlja mapa) i .polja (polja mape) odnosno:

@Test public void shouldReturnStatusAccepted () {Map headers = new HashMap (); headers.put ("prihvatiti", "application / json"); headers.put ("Ovlaštenje", "Donositelj 5a9ce37b3100004f00ab5154"); Polja karte = novi HashMap (); polja.put ("ime", "Sam Baeldung"); polja.put ("id", "PSP123"); HttpResponse jsonResponse = Unirest.put ("// www.mocky.io/v2/5a9ce7853100002a00ab515e") .headers (zaglavlja). Polja (polja) .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (202, jsonResponse.getStatus ()); }

3.1. Donošenje parametara upita

Za prosljeđivanje podataka kao upita Niz, koristit ćemo queryString () metoda:

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

3.2. Korištenje parametara puta

Za prosljeđivanje bilo kojih parametara URL-a možemo koristiti routeParam () metoda:

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

Ime rezerviranog mjesta parametra mora biti isto kao i prvi argument metode.

3.3. Zahtjevi s tijelom

Ako naš zahtjev zahtijeva string / JSON tijelo, prosljeđujemo ga pomoću tijelo() metoda:

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

3.4. Mapa objekata

Da biste koristili asObject () ili tijelo() u zahtjevu moramo definirati svoj mapper objekata. Radi jednostavnosti koristit ćemo Jackson mapper objekata.

Prvo dodajmo sljedeće ovisnosti pom.xml:

 com.fasterxml.jackson.core jackson-databind 2.9.4 

Uvijek koristite najnoviju verziju na Maven Central.

Ajmo sada konfigurirati naš mapper:

Unirest.setObjectMapper (new ObjectMapper () {com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper (); javni String writeValue (vrijednost objekta) {return mapper.writeValueAs; javna T readValue (vrijednost niza, class valueType) {return mapper.readValue (vrijednost, valueType);}});

Imajte na umu da setObjectMapper () treba pozvati samo jednom, za postavljanje mappera; nakon što je postavljena instanca mapiranja, ona će se koristiti za sve zahtjeve i odgovore.

Isprobajmo sada novu funkcionalnost koristeći običaj Članak objekt:

@Test javna praznina givenArticleWhenCreatedThenCorrect () {Članak članak = novi članak ("ID1213", "Vodič za odmor", "baeldung"); HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d") .body (članak) .asJson (); assertEquals (201, jsonResponse.getStatus ()); }

4. Metode zahtjeva

Slično svakom HTTP klijentu, okvir pruža zasebne metode za svaki HTTP glagol:

POŠTA:

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

STAVITI:

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

DOBITI:

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

IZBRISATI:

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

ZAKRPA:

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

OPCIJE:

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

5. Metode odgovora

Kad dobijemo odgovor, provjerimo statusni kod i statusnu poruku:

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

Izdvojite zaglavlja:

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

Dohvatite odgovor:

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

Primijetite da getRawBody (), vraća tok neraščlanjenog tijela odgovora, dok getBody () vraća raščlanjeno tijelo, koristeći mapiranje objekata definirano u ranijem odjeljku.

6. Obrada asinkronih zahtjeva

Unirest također ima sposobnost da obrađuje asinkrone zahtjeve - koristeći java.util.concurrent.Future i metode povratnog poziva:

@Test public void whenAysncRequestShouldReturnOk () {Budućnost future = Unirest.post ("//www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms") .header ("accept", "application / json") .asJsonAsync (novi povratni poziv () {public void failed (UnirestException e) {// Učinite nešto ako zahtjev nije uspio} javna praznina je dovršena (odgovor HttpResponse) {// Učinite nešto ako je zahtjev uspješan} poništena je javna praznina () {// Učinite nešto ako je zahtjev otkazan}}) ; assertEquals (200, future.get (). getStatus ()); }

The com.mashape.unirest.http.async.Callback sučelje pruža tri metode, neuspjeh(), otkazano () i dovršen ().

Zamijenite metode za izvođenje potrebnih operacija, ovisno o odgovoru.

7. Prijenosi datoteka

Da biste učitali ili poslali datoteku kao dio zahtjeva, dodajte java.io.Datoteka objekt kao polje s datotekom imena:

@Test javna praznina givenFileWhenUploadedThenCorrect () {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d"). Polje ("datoteka", nova datoteka ("/ put / do / datoteke")). asJson (); assertEquals (201, jsonResponse.getStatus ()); }

Možemo i koristiti ByteStream:

@Test javna praznina givenByteStreamWhenUploadedThenCorrect () {try (InputStream inputStream = new FileInputStream (new File ("/ path / to / file / artcile.txt"))) {byte [] bytes = new byte [inputStream.available ()]; inputStream.read (bajtovi); HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d") .field ("datoteka", bajtovi, "article.txt") .asJson (); assertEquals (201, jsonResponse.getStatus ()); }}

Ili izravno upotrijebite ulazni tok, dodajući ContentType.APPLICATION_OCTET_STREAM kao drugi argument u polja () metoda:

@Test public void givenInputStreamWhenUploadedThenCorrect () {try (InputStream inputStream = new FileInputStream (new File ("/ path / to / file / artcile.txt"))) {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io / v2 / 5a9ce7663100006800ab515d ") .field (" datoteka ", inputStream, ContentType.APPLICATION_OCTET_STREAM," article.txt "). asJson (); assertEquals (201, jsonResponse.getStatus ()); }}

8. Unirest konfiguracije

Okvir također podržava tipične konfiguracije HTTP klijenta poput spremanja veza, vremenskih ograničenja, globalnih zaglavlja itd.

Postavimo broj veza i maksimalan broj veza po ruti:

Unirest.setConcurrency (20, 5);

Konfigurirajte vremenska ograničenja veze i utičnice:

Unirest.setTimeouts (20000, 15000);

Imajte na umu da su vremenske vrijednosti u milisekundama.

Sada postavimo HTTP zaglavlja za sve naše zahtjeve:

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

Globalna zaglavlja možemo očistiti u bilo kojem trenutku:

Unirest.clearDefaultHeaders ();

U jednom ćemo trenutku možda trebati upućivati ​​zahtjeve putem proxy poslužitelja:

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

Jedan važan aspekt kojeg morate biti svjestan je graciozno zatvaranje ili izlazak iz aplikacije. Unirest stvara pozadinsku petlju događaja da bi obrađivao operacije, trebamo isključiti tu petlju prije izlaska iz naše aplikacije:

Unirest.shutdown ();

9. Zaključak

U ovom uputstvu usredotočili smo se na lagani okvir HTTP klijenta - Unirest. Radili smo s nekoliko jednostavnih primjera, kako u sinkronom, ali i asinkronom načinu rada.

Napokon, koristili smo i nekoliko naprednih konfiguracija - poput spremanja veza, postavki proxyja itd.

Kao i obično, izvorni je kod dostupan na GitHub-u.


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