RESTEasy Client API

1. Introduksjon

I forrige artikkel fokuserte vi på Slapp av server side implementering av JAX-RS 2.0.

JAX-RS 2.0 introduserer et nytt klient-API slik at du kan komme med HTTP-forespørsler til dine eksterne RESTful-nettjenester. Jersey, Apache CXF, Restlet og RESTEasy er bare en delmengde av de mest populære implementeringene.

I denne artikkelen vil vi undersøke hvordan du bruker REST API ved å sende forespørsler med en RESTEasy API.

2. Prosjektoppsett

Legg i din pom.xml følgende avhengighet:

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

3. Klientsides kode

Klientimplementeringen er ganske bestående av 3 hovedklasser:

    • Klient
    • WebTarget
    • Respons

De Klient grensesnitt er en byggherre av WebTarget tilfeller.

WebTarget representerer en distinkt URL eller URL-mal der du kan bygge flere underressurser WebTargets eller påkalle forespørsler.

Det er egentlig to måter å opprette en klient på:

  • Standardveien, ved å bruke org.jboss.resteasy.client.ClientRequest
  • RESTeasy Proxy Framework: ved å bruke ResteasyClientBuilder klasse

Vi vil fokusere på RESTEasy Proxy Framework her.

I stedet for å bruke JAX-RS-merknader for å tilordne en innkommende forespørsel til RESTFul Web Service-metoden, bygger klientrammeverket en HTTP-forespørsel som den bruker til å påkalle på en ekstern RESTful Web Service.

Så la oss begynne å skrive et Java-grensesnitt og bruke JAX-RS-merknader på metodene og på grensesnittet.

3.1. De TjenesterKlient Grensesnitt

@Path ("/ filmer") offentlig grensesnitt 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}) Svaroppdatering Film (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 strengetittel; // getters og setters}

3.3. Forespørselsopprettelsen

Vi genererer nå en proxy-klient som vi kan bruke til å konsumere API:

StrengtransformatorImdbId = "tt0418279"; Film transformerMovie = ny film ("tt0418279", "Transformer 2"); endelig strengbane = "//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 filmsResponse = proxy.addMovie (transformerMovie); System.out.println ("HTTP-kode:" + filmsResponse.getStatus ()); moviesResponse.close (); // FÅ filmfilmer = proxy.movieByImdbId (transformerImdbId); // PUT transformerMovie.setTitle ("Transformer 4"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // SLETT filmResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close (); 

Merk at RESTEasy-klient-API-et er basert på Apache HttpClient.

Vær også oppmerksom på at vi etter hver operasjon må lukke svaret før vi kan utføre en ny operasjon. Dette er nødvendig fordi klienten som standard bare har en tilgjengelig HTTP-tilkobling.

Merk til slutt hvordan vi jobber med DTO-ene direkte - vi har ikke å gjøre med marshal / unmarshal-logikken til og fra JSON eller XML; som skjer bak kulissene ved hjelp av JAXB eller Jackson siden Film klassen ble skikkelig kommentert.

3.4. Forespørsel om oppretting med tilkoblingsbasseng

Et notat fra forrige eksempel var at vi bare hadde en enkelt tilkobling tilgjengelig. Hvis - for eksempel, prøver vi å gjøre:

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

uten å påkalle Lukk()batmanResponse - et unntak blir kastet når andre linje kjøres:

java.lang.IllegalStateException: Ugyldig bruk av BasicClientConnManager: tilkobling fortsatt tildelt. Sørg for å frigjøre forbindelsen før du tildeler en annen. 

Igjen - dette skjer rett og slett fordi standard HttpClient brukt av RESTEasy er org.apache.http.impl.conn.SingleClientConnManager - som selvfølgelig bare gjør en enkelt forbindelse tilgjengelig.

Nå - for å omgå den begrensningen - RestEasyClient forekomst må opprettes annerledes (med en tilkoblingsgruppe):

PoolingHttpClientConnectionManager cm = ny PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // Øk maksimal totalforbindelse til 200 cm.setDefaultMaxPerRoute (20); // Øk standard maksimal tilkobling per rute til 20 ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine (httpClient); ResteasyClient-klient = ny ResteasyClientBuilder (). HttpEngine (motor) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (sti)); ServicesInterface proxy = target.proxy (ServicesInterface.class);

Nå kan vi dra nytte av et skikkelig tilkoblingsbasseng og kan ha flere forespørsler som kjører gjennom klienten vår uten nødvendigvis å måtte frigjøre forbindelsen hver gang.

4. Konklusjon

I denne raske opplæringen introduserte vi RESTEasy Proxy Framework og vi bygde en superenkel klient-API med den.

Rammeverket gir oss noen flere hjelpemetoder for å konfigurere en klient og kan defineres som speilet motsatt av JAX-RS server-spesifikasjoner.

Eksemplet som brukes i denne artikkelen er tilgjengelig som et eksempelprosjekt i GitHub.


$config[zx-auto] not found$config[zx-overlay] not found