RESTEasy Client API
1. Úvod
V predchádzajúcom článku sme sa zamerali na RESTE Ľahko implementácia servera na serveri JAX-RS 2.0.
JAX-RS 2.0 predstavuje nové klientske rozhranie API, aby ste mohli odosielať požiadavky HTTP do vašich vzdialených webových služieb RESTful. Jersey, Apache CXF, Restlet a RESTEasy sú iba podmnožinou najpopulárnejších implementácií.
V tomto článku preskúmame, ako konzumovať REST API zasielaním žiadostí s a RESTEasy API.
2. Nastavenie projektu
Pridajte do svojho pom.xml nasledujúca závislosť:
3.0.14.Final org.jboss.resteasy resteasy-client $ {resteasy.version} ...
3. Kód na strane klienta
Implementácia klienta je celkom dobrá a skladá sa z 3 hlavných tried:
- Zákazník
- WebTarget
- Odozva
The Zákazník rozhranie je staviteľ servera WebTarget inštancie.
WebTarget predstavuje samostatnú adresu URL alebo šablónu adresy URL, z ktorej môžete vytvoriť ďalšie podzdrojové webové ciele alebo na ktoré môžete vyvolať žiadosti.
Existujú skutočne dva spôsoby, ako vytvoriť klienta:
- Štandardným spôsobom pomocou org.jboss.resteasy.client.ClientRequest
- RESTeasy Proxy Framework: pomocou ResteasyClientBuilder trieda
Tu sa zameriame na RESTEasy Proxy Framework.
Namiesto použitia anotácií JAX-RS na mapovanie prichádzajúcej požiadavky na vašu metódu RESTFul Web Service vytvára klientske rozhranie požiadavku HTTP, ktorú používa na vyvolanie na vzdialenej RESTful Web Service.
Začnime teda písať rozhranie Java a používať anotácie JAX-RS na metódy a na rozhranie.
3.1. The ServicesClient Rozhranie
@Path ("/ films") verejné rozhranie ServicesInterface {@GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Movie movieByImdbId (@QueryParam ("imdbId"); reťazec imdbId @POST @Path ("/ addmovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Odpoveď addMovie (filmový film); @PUT @Path ("/ updatemovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Response updateMovie (filmový film); @DELETE @Path ("/ deletemovie") Odpoveď deleteMovie (@QueryParam ("imdbId") Reťazec imdbId); }
3.2. Filmová trieda
@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "film", propOrder = {"imdbId", "title"}) verejná trieda Film {chránený reťazec imdbId; chránený názov reťazca; // zakladatelia a zakladatelia}
3.3. Vytvorenie žiadosti
Teraz vygenerujeme proxy klienta, ktorého môžeme použiť na využitie API:
Reťazcový transformátorImdbId = "tt0418279"; Movie transformerMovie = nový film ("tt0418279", "Transformer 2"); final String path = "//127.0.0.1:8080/RestEasyTutorial/rest"; Klient ResteasyClient = nový ResteasyClientBuilder (). Build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (cesta)); ServicesInterface proxy = target.proxy (ServicesInterface.class); // POST Response filmsResponse = proxy.addMovie (transformerMovie); System.out.println ("HTTP code:" + moviesResponse.getStatus ()); moviesResponse.close (); // ZÍSKAJTE filmové filmy = proxy.movieByImdbId (transformerImdbId); // PUT transformerMovie.setTitle ("Transformer 4"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // ODSTRÁNIŤ moviesResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close ();
Upozorňujeme, že API klienta RESTEasy je založené na Apache HttpClient.
Upozorňujeme tiež, že po každej operácii budeme musieť zavrieť odpoveď, aby sme mohli vykonať novú operáciu. Je to nevyhnutné, pretože klient má v predvolenom nastavení k dispozícii iba jedno pripojenie HTTP.
Na záver si všimnite, ako pracujeme priamo s DTO - nezaoberáme sa logikou maršala / unmaršala do az JSON alebo XML; to sa deje v zákulisí použitia JAXB alebo Jackson od Film trieda bola správne anotovaná.
3.4. Vytvorenie požiadavky s fondom pripojení
Jedna poznámka z predchádzajúceho príkladu bola, že sme mali k dispozícii iba jedno pripojenie. Ak sa napríklad pokúsime urobiť:
Odpoveď batmanResponse = proxy.addMovie (batmanMovie); Response transformerResponse = proxy.addMovie (transformerMovie);
bez dovolania Zavrieť() na batmanResponse - pri spustení druhého riadku bude vyvolaná výnimka:
java.lang.IllegalStateException: Neplatné použitie BasicClientConnManager: pripojenie je stále pridelené. Pred pridelením ďalšieho nezabudnite uvoľniť pripojenie.
Opäť - to sa jednoducho stáva, pretože predvolené HttpClient používa RESTEasy je org.apache.http.impl.conn.SingleClientConnManager - ktorý samozrejme sprístupňuje iba jedno pripojenie.
Teraz - obísť toto obmedzenie - RestEasyClient inštancia musí byť vytvorená inak (s fondom pripojení):
PoolingHttpClientConnectionManager cm = nový PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // Zvýšenie maximálneho celkového počtu pripojení na 200 cm.setDefaultMaxPerRoute (20); // Zvýšenie predvoleného maximálneho počtu pripojení na jednu cestu na 20 ApacheHttpClient4Engine engine = nový ApacheHttpClient4Engine (httpClient); Klient ResteasyClient = nový ResteasyClientBuilder (). HttpEngine (engine) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (cesta)); ServicesInterface proxy = target.proxy (ServicesInterface.class);
Teraz môžeme ťažiť zo správneho fondu pripojení a môže cez nášho klienta bežať niekoľko požiadaviek, bez toho, aby bolo nutné zakaždým uvoľňovať spojenie.
4. Záver
V tomto rýchlom návode sme predstavili RESTEasy Proxy Framework a vytvorili sme s ním super jednoduché klientske rozhranie API.
Rámec nám poskytuje niekoľko ďalších pomocných metód na konfiguráciu klienta a dá sa definovať ako zrkadlo oproti špecifikáciám na strane servera JAX-RS.
Príklad použitý v tomto článku je k dispozícii ako vzorový projekt v GitHub.