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.