API RESTEasy Client

1. Uvod

U prethodnom članku usredotočili smo se na ODMORNO implementacija na strani poslužitelja JAX-RS 2.0.

JAX-RS 2.0 uvodi novi API klijenta tako da možete slati HTTP zahtjeve na vaše udaljene RESTful web usluge. Jersey, Apache CXF, Restlet i RESTEasy samo su podskup najpopularnijih implementacija.

U ovom ćemo članku istražiti kako konzumirati REST API slanjem zahtjeva s a RESTEasy API.

2. Postavljanje projekta

Dodajte u svoj pom.xml sljedeća ovisnost:

 3.0.14.Final org.jboss.resteasy resteasy-client $ {resteasy.version} ... 

3. Šifra na strani klijenta

Klijentska implementacija je prilično sastavljena od 3 glavne klase:

    • Klijent
    • WebTarget
    • Odgovor

The Klijent sučelje je graditelj WebTarget instance.

WebTarget predstavlja zaseban URL ili predložak URL-a iz kojeg možete izraditi više web-ciljeva pod-resursa ili pozvati zahtjeve.

Postoje stvarno dva načina za stvaranje klijenta:

  • Standardni način korištenjem org.jboss.resteasy.client.ClientRequest
  • RESTeasy Proxy Framework: pomoću ResteasyClientBuilder razred

Ovdje ćemo se usredotočiti na RESTEasy Proxy Framework.

Umjesto da koristi JAX-RS napomene za mapiranje dolaznog zahtjeva na vašu metodu RESTFul Web Service, klijentski okvir gradi HTTP zahtjev koji koristi za pozivanje na udaljenom RESTful Web Serviceu.

Počnimo s pisanjem Java sučelja i korištenjem JAX-RS bilješki na metodama i na sučelju.

3.1. The Klijent usluge Sučelje

@Path ("/ movies") javno sučelje ServicesInterface {@GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Movie movieByImdbId (@QueryParam ("imdbId") String imdbId); @POST @Path ("/ addmovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Odgovor addMovie (filmski film); @PUT @Path ("/ updatemovie") @ Potrošnja ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Odgovor updateMovie (Filmski film); @DELETE @Path ("/ deletemovie") Odgovor deleteMovie (@QueryParam ("imdbId") String imdbId); } 

3.2. Filmska klasa

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "movie", propOrder = {"imdbId", "title"}) film javne klase {zaštićen niz imdbId; zaštićeni naslov niza; // geteri i postavljači}

3.3. Izrada zahtjeva

Sada ćemo generirati proxy klijenta koji možemo koristiti za konzumiranje API-ja:

Strujni transformatorImdbId = "tt0418279"; Filmski transformatorMovie = novi film ("tt0418279", "Transformer 2"); konačna putanja niza = "//127.0.0.1:8080/RestEasyTutorial/rest"; ResteasyClient klijent = novi ResteasyClientBuilder (). Build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (path)); ServicesInterface proxy = target.proxy (ServicesInterface.class); // POST Response moviesResponse = proxy.addMovie (transformerMovie); System.out.println ("HTTP kôd:" + moviesResponse.getStatus ()); moviesResponse.close (); // DOBIJEM filmske filmove = proxy.movieByImdbId (transformerImdbId); // STAVITE transformerMovie.setTitle ("Transformer 4"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // IZBRIŠI moviesResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close (); 

Imajte na umu da se API klijentskog RESTEasy temelji na Apacheu HttpClient.

Također imajte na umu da ćemo nakon svake operacije morati zatvoriti odgovor prije nego što izvedemo novu operaciju. To je neophodno jer klijent prema zadanim postavkama ima na raspolaganju samo jednu HTTP vezu.

Na kraju, imajte na umu kako izravno radimo s DTO-ima - ne bavimo se maršalnom / nemaršalnom logikom od i do JSON ili XML; to se događa iza scene koristeći JAXB ili Jackson od Film razred bio pravilno označen.

3.4. Izrada zahtjeva s bazenom za povezivanje

Jedna napomena iz prethodnog primjera bila je da smo imali na raspolaganju samo jednu vezu. Ako - na primjer, pokušamo učiniti:

Odgovor batmanResponse = proxy.addMovie (batmanMovie); Response transformerResponse = proxy.addMovie (transformerMovie); 

bez prizivanja Zatvoriti() na batmanOdgovor - izuzetak će se pojaviti kada se izvrši drugi redak:

java.lang.IllegalStateException: Neispravna upotreba BasicClientConnManager: veza je i dalje dodijeljena. Obavezno otpustite vezu prije dodjeljivanja druge. 

Opet - to se jednostavno događa jer je zadano HttpClient koristi RESTEasy je org.apache.http.impl.conn.SingleClientConnManager - što naravno omogućuje samo jednu vezu.

Sada - da zaobiđemo to ograničenje - RestEasyClient instanca mora biti kreirana drugačije (s bazenom veza):

PoolingHttpClientConnectionManager cm = novo PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // Povećanje maksimalne ukupne veze na 200 cm.setDefaultMaxPerRoute (20); // Povećanje zadane maksimalne veze po ruti na 20 ApacheHttpClient4Engine engine = novi ApacheHttpClient4Engine (httpClient); ResteasyClient klijent = novi ResteasyClientBuilder (). HttpEngine (engine) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (path)); ServicesInterface proxy = target.proxy (ServicesInterface.class);

Sad možemo imati koristi od pravilnog spremišta veza i može imati više zahtjeva koji se provode kroz našeg klijenta, a da pritom ne mora svaki put otpustiti vezu.

4. Zaključak

U ovom smo brzom vodiču predstavili RESTEasy Proxy Framework i sa njim smo izgradili super jednostavan klijentski API.

Okvir nam daje još nekoliko pomoćnih metoda za konfiguriranje klijenta i može se definirati kao zrcalo suprotno specifikacijama JAX-RS na strani poslužitelja.

Primjer korišten u ovom članku dostupan je kao ogledni projekt u GitHubu.


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