RESTEasy Client API
1. Bemutatkozás
Az előző cikkben a RESTEasy szerver oldali megvalósítása JAX-RS 2.0.
JAX-RS 2.0 új kliens API-t vezet be, hogy HTTP kéréseket küldhessen a távoli RESTful webszolgáltatásaihoz. A Jersey, az Apache CXF, a Restlet és a RESTEasy csak a legnépszerűbb megvalósítások részhalmaza.
Ebben a cikkben azt vizsgáljuk, hogyan kell fogyasztani REST API kérések küldésével a RESTEasy API.
2. Projekt beállítása
Add hozzá a pom.xml a következő függőség:
3.0.14. A végső org.jboss.resteasy resteasy-client $ {resteasy.version} ...
3. Ügyféloldali kód
Az ügyfélmegvalósítás meglehetősen nagy, 3 fő osztályból áll:
- Ügyfél
- Webcél
- Válasz
A Ügyfél interfész a Webcél példányok.
Webcél egy különálló URL-t vagy URL-sablont képvisel, amelyből további alforrás-WebTargets-eket készíthet, vagy amelyekre kéréseket indíthat.
Az Ügyfél létrehozásának valóban két módja van:
- A szokásos módon, a org.jboss.resteasy.client.ClientRequest
- RESTeasy Proxy Framework: a ResteasyClientBuilder osztály
Itt a RESTEasy Proxy Framework-re fogunk koncentrálni.
Ahelyett, hogy JAX-RS annotációkat használna egy bejövő kérés leképezéséhez a RESTFul Web Service módszerhez, az ügyfélkeret egy HTTP kérést épít, amelyet egy távoli RESTful webszolgáltatásra hív meg.
Tehát kezdjük el a Java felület írását és a JAX-RS kommentárok használatát a módszereken és az interfészen.
3.1. A ServicesClient Felület
@Path ("/ movies") nyilvános felület ServicesInterface {@GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Movie movieByImdbId (@QueryParam ("imdbId") String imdb; @POST @Path ("/ addmovie") @Cumsumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Válasz addMovie (Filmfilm); @PUT @Path ("/ updatemovie") @Cumsumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Válasz updateMovie (film); @DELETE @Path ("/ deletemovie") Válasz deleteMovie (@QueryParam ("imdbId") String imdbId); }
3.2. A film osztály
@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "movie", propOrder = {"imdbId", "title"}) public class Movie {protected String imdbId; védett String cím; // szerelők és beállítók}
3.3. A létrehozás kérése
Most létrehozunk egy proxy klienst, amelyet felhasználhatunk az API felhasználására:
Karakterlánc transzformátorImdbId = "tt0418279"; Film transformerMovie = new Movie ("tt0418279", "Transformer 2"); végső karakterláncút = "//127.0.0.1:8080/RestEasyTutorial/rest"; ResteasyClient kliens = new ResteasyClientBuilder (). Build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (elérési út)); ServicesInterface proxy = target.proxy (ServicesInterface.class); // POST Response moviesResponse = proxy.addMovie (transformerMovie); System.out.println ("HTTP-kód:" + moviesResponse.getStatus ()); moviesResponse.close (); // GET Movie movies = proxy.movieByImdbId (transformerImdbId); // PUT transformerMovie.setTitle ("4. transzformátor"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // DELETE moviesResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close ();
Vegye figyelembe, hogy a RESTEasy kliens API az Apache-on alapul HttpClient.
Vegye figyelembe azt is, hogy minden művelet után le kell zárnunk a választ, mielőtt új műveletet hajthatunk végre. Erre azért van szükség, mert az ügyfélnek alapértelmezés szerint csak egyetlen HTTP-kapcsolat áll rendelkezésre.
Végül vegye figyelembe, hogyan dolgozunk közvetlenül a DTO-kkal - nem foglalkozunk a marsall / unmarshal logikával oda és vissza JSON vagy XML; ami a színfalak mögött történik JAXB vagy Jackson mivel a Film osztály megfelelő jegyzetekkel ellátva.
3.4. A létrehozás kérése csatlakozási készlettel
Az előző példa egyik megjegyzése az volt, hogy csak egyetlen kapcsolat állt rendelkezésünkre. Ha például megpróbáljuk:
Válasz batmanResponse = proxy.addMovie (batmanMovie); Válasz transzformátorResponse = proxy.addMovie (transformerMovie);
hivatkozás nélkül Bezárás() tovább batmanResponse - a második sor végrehajtásakor kivételt kell tenni:
java.lang.IllegalStateException: A BasicClientConnManager érvénytelen használata: a kapcsolat továbbra is kiosztva van. Mielőtt hozzárendelne egy másikat, feltétlenül bontsa fel a kapcsolatot.
Ismét - ez egyszerűen azért történik, mert az alapértelmezett HttpClient által használt RESTEasy is org.apache.http.impl.conn.SingleClientConnManager - ami természetesen csak egyetlen kapcsolatot tesz elérhetővé.
Most - hogy megkerülje ezt a korlátozást - a RestEasyClient a példányt másképp kell létrehozni (kapcsolatkészlettel):
PoolingHttpClientConnectionManager cm = új PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // Növelje a maximális teljes kapcsolatot 200 cm-re.setDefaultMaxPerRoute (20); // Az alapértelmezett maximális kapcsolat növelése útvonalonként 20-ig ApacheHttpClient4Engine motor = új ApacheHttpClient4Engine (httpClient); ResteasyClient kliens = new ResteasyClientBuilder (). HttpEngine (motor) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (elérési út)); ServicesInterface proxy = target.proxy (ServicesInterface.class);
Most már tehetjük részesüljenek a megfelelő csatlakozási készletből és több kérés is futhat az ügyfelünkön, anélkül, hogy szükségszerűen fel kellene oldania a kapcsolatot.
4. Következtetés
Ebben a gyors bemutatóban bemutattuk a RESTEasy Proxy Framework és felépítettünk vele egy nagyon egyszerű kliens API-t.
A keretrendszer ad még néhány segítő módszert egy kliens konfigurálásához, és a JAX-RS szerveroldali specifikációkkal ellentétes tükörként határozható meg.
A cikkben használt példa mintaprojektként érhető el a GitHub-ban.