RESTEasy Client API

1. Pengenalan

Dalam artikel sebelumnya kami memfokuskan pada pelaksanaan pelayan RESTEasy dari JAX-RS 2.0 .

JAX-RS 2.0 memperkenalkan API klien baru sehingga anda dapat membuat permintaan HTTP ke perkhidmatan web RESTful jauh anda. Jersey, Apache CXF, Restlet dan RESTEasy hanyalah sebahagian daripada pelaksanaan yang paling popular.

Dalam artikel ini kita akan meneroka cara menggunakan API REST dengan mengirim permintaan dengan RESTEasy API .

2. Penyediaan Projek

Tambahkan pom.xml kebergantungan berikut:

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

3. Kod Sampingan Pelanggan

Pelaksanaan klien cukup, terdiri daripada 3 kelas utama:

    • Pelanggan
    • Webgetarget
    • Tanggapan

The Client muka adalah pembina WebTarget keadaan.

WebTarget mewakili URL atau templat URL yang berbeza dari mana anda boleh membina lebih banyak WebTarget sub-sumber atau meminta permintaan.

Terdapat dua cara untuk membuat Pelanggan:

  • Cara standard, dengan menggunakan org.jboss.resteasy.client.ClientRequest
  • RESTeasy Proxy Framework : dengan menggunakan kelas ResteasyClientBuilder

Kami akan memberi tumpuan kepada RESTEasy Proxy Framework di sini.

Daripada menggunakan anotasi JAX-RS untuk memetakan permintaan masuk ke kaedah Perkhidmatan Web RESTFul anda, kerangka pelanggan membina permintaan HTTP yang digunakannya untuk meminta pada Perkhidmatan Web RESTful yang jauh.

Oleh itu, mari kita mula menulis antara muka Java dan menggunakan anotasi JAX-RS mengenai kaedah dan antara muka.

3.1. The ServicesClient Interface

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

3.2. Kelas Filem

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "movie", propOrder = { "imdbId", "title" }) public class Movie { protected String imdbId; protected String title; // getters and setters }

3.3. Permintaan Penciptaan

Kami sekarang akan menghasilkan klien proksi yang dapat kita gunakan untuk menggunakan API:

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

Perhatikan bahawa API klien RESTEasy didasarkan pada Apache HttpClient .

Perhatikan juga bahawa, selepas setiap operasi, kita perlu menutup tindak balas sebelum kita dapat melakukan operasi baru. Ini perlu kerana, secara lalai, klien hanya mempunyai satu sambungan HTTP yang tersedia.

Akhirnya, perhatikan bagaimana kami bekerja dengan DTO secara langsung - kami tidak berurusan dengan logik marshal / unmarshal ke dan dari JSON atau XML ; yang berlaku di belakang tabir menggunakan JAXB atau Jackson sejak kelas Filem dianotasi dengan betul .

3.4. Permintaan Penciptaan Dengan Kolam Sambungan

Satu catatan dari contoh sebelumnya adalah bahawa kami hanya mempunyai satu sambungan sahaja. Sekiranya - sebagai contoh, kami cuba lakukan:

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

tanpa memanggil close () pada batmanResponse - pengecualian akan dilemparkan ketika baris kedua dijalankan:

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated. Make sure to release the connection before allocating another one. 

Sekali lagi - ini berlaku kerana HttpClient lalai yang digunakan oleh RESTEasy adalah org.apache.http.impl.conn.SingleClientConnManager - yang tentunya hanya menyediakan satu sambungan sahaja.

Sekarang - untuk mengatasi had itu - contoh RestEasyClient mesti dibuat secara berbeza (dengan kumpulan sambungan):

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); cm.setMaxTotal(200); // Increase max total connection to 200 cm.setDefaultMaxPerRoute(20); // Increase default max connection per route to 20 ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient); ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build(); ResteasyWebTarget target = client.target(UriBuilder.fromPath(path)); ServicesInterface proxy = target.proxy(ServicesInterface.class);

Sekarang kita dapat memperoleh keuntungan dari kumpulan sambungan yang betul dan dapat mempunyai banyak permintaan melalui pelanggan kita tanpa harus melepaskan sambungan setiap kali.

4. Kesimpulan

Dalam tutorial ringkas ini, kami memperkenalkan RESTEasy Proxy Framework dan kami membina API pelanggan yang sangat sederhana dengannya.

Rangka kerja ini memberi kita beberapa kaedah penolong untuk mengkonfigurasi klien dan dapat didefinisikan sebagai cermin yang bertentangan dengan spesifikasi sisi pelayan JAX-RS.

Contoh yang digunakan dalam artikel ini boleh didapati sebagai contoh projek di GitHub.