RESTEasy Client API

1. Introduktion

I den forrige artikel fokuserede vi på RESTEasy server side implementering af JAX-RS 2.0.

JAX-RS 2.0 introducerer en ny klient-API, så du kan foretage HTTP-anmodninger til dine eksterne RESTful-webtjenester. Jersey, Apache CXF, Restlet og RESTEasy er kun en delmængde af de mest populære implementeringer.

I denne artikel vil vi undersøge, hvordan man forbruger REST API ved at sende anmodninger med en RESTEasy API.

2. Opsætning af projekt

Tilføj i din pom.xml følgende afhængighed:

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

3. Kundsides kode

Klientimplementeringen er ret bestående af 3 hovedklasser:

    • Klient
    • WebTarget
    • Respons

Det Klient interface er en bygherre af WebTarget tilfælde.

WebTarget repræsenterer en særskilt URL eller URL-skabelon, hvorfra du kan bygge flere underressourcer WebTargets eller påberåbe sig anmodninger.

Der er virkelig to måder at oprette en klient på:

  • Den standard måde ved hjælp af org.jboss.resteasy.client.ClientRequest
  • RESTeasy Proxy Framework: ved hjælp af ResteasyClientBuilder klasse

Vi vil fokusere på RESTEasy Proxy Framework her.

I stedet for at bruge JAX-RS-annoteringer til at kortlægge en indgående anmodning til din RESTFul Web Service-metode, bygger klientrammen en HTTP-anmodning, som den bruger til at påberåbe sig en ekstern RESTful Web Service.

Så lad os begynde at skrive en Java-grænseflade og bruge JAX-RS-kommentarer til metoderne og på grænsefladen.

3.1. Det Services klient Interface

@Path ("/ film") offentlig grænseflade ServicesInterface {@GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Film movieByImdbId (@QueryParam ("imdbId") String imdbId) @POST @Path ("/ addmovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) Svar addMovie (filmfilm); @PUT @Path ("/ updatemovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) SvaropdateringMovie (filmfilm); @ DELETE @Path ("/ deletemovie") Svar deleteMovie (@QueryParam ("imdbId") Streng imdbId); } 

3.2. Filmklassen

@XmlAccessorType (XmlAccessType.FIELD) @XmlType (navn = "film", propOrder = {"imdbId", "title"}) offentlig klasse Film {beskyttet streng imdbId; beskyttet streng titel; // getters og setters}

3.3. Anmodningen om oprettelse

Vi genererer nu en proxy-klient, som vi kan bruge til at forbruge API:

Streng transformerImdbId = "tt0418279"; Film transformerMovie = ny film ("tt0418279", "Transformer 2"); endelig strengsti = "//127.0.0.1:8080/RestEasyTutorial/rest"; ResteasyClient-klient = ny ResteasyClientBuilder (). Build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (sti)); ServicesInterface proxy = target.proxy (ServicesInterface.class); // POST Response filmResponse = proxy.addMovie (transformerMovie); System.out.println ("HTTP-kode:" + filmResponse.getStatus ()); moviesResponse.close (); // FÅ filmfilm = proxy.movieByImdbId (transformerImdbId); // PUT transformerMovie.setTitle ("Transformer 4"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // SLET filmResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close (); 

Bemærk, at RESTEasy-klient-API'en er baseret på Apache HttpClient.

Bemærk også, at vi efter hver operation skal lukke svaret, før vi kan udføre en ny operation. Dette er nødvendigt, fordi klienten som standard kun har en tilgængelig HTTP-forbindelse.

Til sidst skal du bemærke, hvordan vi arbejder direkte med DTO'erne - vi har ikke at gøre med marskalk / unmarshal-logikken til og fra JSON eller XML; der sker bag kulisserne ved hjælp af JAXB eller Jackson siden Film klasse blev korrekt kommenteret.

3.4. Anmodning oprettelse med forbindelsespool

En note fra det foregående eksempel var, at vi kun havde en enkelt forbindelse tilgængelig. Hvis vi for eksempel forsøger at gøre:

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

uden at påberåbe sig tæt()batmanRespons - en undtagelse kastes, når anden linje udføres:

java.lang.IllegalStateException: Ugyldig brug af BasicClientConnManager: forbindelsen er stadig allokeret. Sørg for at frigøre forbindelsen, før du tildeler en anden. 

Igen - dette sker simpelthen fordi standard HttpClient brugt af RESTEasy er org.apache.http.impl.conn.SingleClientConnManager - som naturligvis kun gør en enkelt forbindelse tilgængelig.

Nu - for at omgå denne begrænsning - RestEasyClient forekomst skal oprettes forskelligt (med en forbindelsespulje):

PoolingHttpClientConnectionManager cm = ny PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // Forøg maks. Samlet forbindelse til 200 cm.setDefaultMaxPerRoute (20); // Forøg standard maksimumforbindelse pr. Rute til 20 ApacheHttpClient4Engine-motor = ny ApacheHttpClient4Engine (httpClient); ResteasyClient-klient = ny ResteasyClientBuilder (). HttpEngine (motor) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (sti)); ServicesInterface proxy = target.proxy (ServicesInterface.class);

Nu kan vi drage fordel af en ordentlig forbindelsespool og kan have flere anmodninger, der kører gennem vores klient uden nødvendigvis at skulle frigive forbindelsen hver gang.

4. Konklusion

I denne hurtige vejledning introducerede vi RESTEasy Proxy Framework og vi byggede en superenkel klient-API med det.

Rammen giver os et par flere hjælpemetoder til at konfigurere en klient og kan defineres som spejlet modsat af JAX-RS serversidespecifikationer.

Eksemplet brugt i denne artikel er tilgængeligt som et eksempelprojekt i GitHub.