RESTEasy Client API

1. Inleiding

In het vorige artikel hebben we ons gericht op de RESTEasy server-side implementatie van JAX-RS 2.0.

JAX-RS 2.0 introduceert een nieuwe client-API, zodat u HTTP-verzoeken kunt doen aan uw externe RESTful-webservices. Jersey, Apache CXF, Restlet en RESTEasy zijn slechts een subset van de meest populaire implementaties.

In dit artikel zullen we onderzoeken hoe u de REST API door verzoeken te verzenden met een RESTEasy API.

2. Projectconfiguratie

Voeg uw pom.xml de volgende afhankelijkheid:

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

3. Code aan de kant van de klant

De implementatie van de client is behoorlijk, bestaande uit 3 hoofdklassen:

    • Cliënt
    • WebTarget
    • Reactie

De Cliënt interface is een bouwer van WebTarget gevallen.

WebTarget vertegenwoordigt een aparte URL of URL-sjabloon waaruit u meer sub-resource WebTargets kunt bouwen of verzoeken kunt aanroepen op.

Er zijn in feite twee manieren om een ​​client aan te maken:

  • De standaardmanier, door de org.jboss.resteasy.client.ClientRequest
  • RESTeasy Proxy Framework: met behulp van de ResteasyClientBuilder klasse

We zullen ons hier concentreren op het RESTEasy Proxy Framework.

In plaats van JAX-RS-annotaties te gebruiken om een ​​inkomend verzoek toe te wijzen aan uw RESTFul Web Service-methode, bouwt het clientframework een HTTP-verzoek op dat het gebruikt om aan te roepen op een externe RESTFul Web Service.

Laten we dus beginnen met het schrijven van een Java-interface en het gebruik van JAX-RS-annotaties op de methoden en op de interface.

3.1. De DienstenClient Koppel

@Path ("/ movies") openbare interface 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}) Reactie addMovie (filmfilm); @PUT @Path ("/ updatemovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Reactie updateMovie (filmfilm); @DELETE @Path ("/ deletemovie") Reactie deleteMovie (@QueryParam ("imdbId") String imdbId); } 

3.2. De filmklasse

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (name = "movie", propOrder = {"imdbId", "title"}) openbare klasse Movie {protected String imdbId; beschermde String-titel; // getters en setters}

3.3. Het aanmaken van het verzoek

We zullen nu een proxy-client genereren die we kunnen gebruiken om de API te gebruiken:

String transformerImdbId = "tt0418279"; Movie transformerMovie = nieuwe film ("tt0418279", "Transformer 2"); final String path = "//127.0.0.1:8080/RestEasyTutorial/rest"; ResteasyClient client = nieuwe ResteasyClientBuilder (). Build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (pad)); ServicesInterface-proxy = target.proxy (ServicesInterface.class); // POST Response moviesResponse = proxy.addMovie (transformerMovie); System.out.println ("HTTP-code:" + moviesResponse.getStatus ()); moviesResponse.close (); // GET Movie-films = proxy.movieByImdbId (transformerImdbId); // PUT transformerMovie.setTitle ("Transformer 4"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // WISSEN moviesResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close (); 

Merk op dat de RESTEasy-client-API is gebaseerd op de Apache HttpClient.

Merk ook op dat we na elke bewerking het antwoord moeten sluiten voordat we een nieuwe bewerking kunnen uitvoeren. Dit is nodig omdat de client standaard slechts één HTTP-verbinding beschikbaar heeft.

Merk ten slotte op hoe we rechtstreeks met de DTO's werken - we hebben niet te maken met de marshal / unmarshal-logica van en naar JSON of XML; dat gebeurt achter de schermen met JAXB of Jackson sinds de Film klasse was correct geannoteerd.

3.4. Het maken van aanvragen met verbindingspool

Een opmerking uit het vorige voorbeeld was dat we maar één verbinding beschikbaar hadden. Als we bijvoorbeeld proberen te doen:

Antwoord batmanResponse = proxy.addMovie (batmanMovie); Antwoord transformerResponse = proxy.addMovie (transformerMovie); 

zonder een beroep te doen dichtbij() Aan batmanResponse - er wordt een uitzondering gegenereerd wanneer de tweede regel wordt uitgevoerd:

java.lang.IllegalStateException: ongeldig gebruik van BasicClientConnManager: verbinding nog steeds toegewezen. Zorg ervoor dat u de verbinding verbreekt voordat u een andere toewijst. 

Nogmaals - dit gebeurt gewoon omdat de standaard HttpClient gebruikt door RESTEasy is org.apache.http.impl.conn.SingleClientConnManager - waardoor er natuurlijk maar één verbinding beschikbaar is.

Nu - om die beperking te omzeilen - de RestEasyClient instantie moet anders worden gemaakt (met een verbindingspool):

PoolingHttpClientConnectionManager cm = nieuw PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // Verhoog de maximale totale verbinding tot 200 cm. SetDefaultMaxPerRoute (20); // Verhoog de standaard maximale verbinding per route naar 20 ApacheHttpClient4Engine-engine = nieuwe ApacheHttpClient4Engine (httpClient); ResteasyClient client = nieuwe ResteasyClientBuilder (). HttpEngine (engine) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (pad)); ServicesInterface-proxy = target.proxy (ServicesInterface.class);

Nu kunnen we profiteren van een goede verbindingspool en kunnen meerdere verzoeken via onze client laten lopen zonder dat de verbinding elke keer hoeft te worden verbroken.

4. Conclusie

In deze korte tutorial hebben we de RESTEasy Proxy Framework en we hebben er een supereenvoudige client-API mee gebouwd.

Het framework geeft ons nog een paar hulpmethoden om een ​​client te configureren en kan worden gedefinieerd als de spiegel tegenovergestelde van de JAX-RS server-side specificaties.

Het voorbeeld dat in dit artikel wordt gebruikt, is beschikbaar als voorbeeldproject in GitHub.