JAX-RS hanyalah sebuah API!

1. Ikhtisar

Paradigma REST telah ada selama beberapa tahun sekarang dan masih mendapat banyak perhatian.

RESTful API dapat diimplementasikan di Java dalam beberapa cara: Anda dapat menggunakan Spring, JAX-RS, atau Anda mungkin hanya menulis servlet telanjang Anda sendiri jika Anda cukup baik dan berani. Yang Anda butuhkan hanyalah kemampuan untuk mengekspos metode HTTP - sisanya adalah tentang bagaimana Anda mengaturnya dan bagaimana Anda memandu klien saat melakukan panggilan ke API Anda.

Seperti yang bisa Anda lihat dari judulnya, artikel ini akan membahas JAX-RS. Tapi apa artinya "hanya API"? Ini berarti bahwa fokus di sini adalah untuk mengklarifikasi kebingungan antara JAX-RS dan implementasinya serta menawarkan contoh seperti apa webapp JAX-RS yang tepat.

2. Dimasukkan dalam Java EE

JAX-RS tidak lebih dari sebuah spesifikasi, seperangkat antarmuka dan penjelasan yang ditawarkan oleh Java EE. Dan kemudian, tentu saja, kami memiliki implementasinya; beberapa yang lebih terkenal adalah RESTEasy dan Jersey.

Juga, jika Anda pernah memutuskan untuk membangun server aplikasi yang sesuai dengan JEE, orang-orang dari Oracle akan memberi tahu Anda bahwa, di antara banyak hal lainnya, server Anda harus menyediakan implementasi JAX-RS untuk aplikasi yang diterapkan untuk digunakan. Itulah mengapa ini disebut Platform Edisi Perusahaan Java .

Contoh bagus lainnya dari spesifikasi dan implementasi adalah JPA dan Hibernate.

2.1. Perang Ringan

Jadi bagaimana semua ini membantu kami, para pengembang? Bantuannya adalah penerapan kami dapat dan harus sangat sedikit, membiarkan server aplikasi menyediakan pustaka yang diperlukan. Ini juga berlaku saat mengembangkan RESTful API: artefak terakhir tidak boleh berisi informasi apa pun tentang implementasi JAX-RS yang digunakan.

Tentu, kami dapat menyediakan implementasinya (inilah tutorial untuk RESTeasy). Tapi kemudian kita tidak bisa lagi menyebut aplikasi kita "aplikasi Java EE". Jika besok seseorang datang dan berkata, " Oke, saatnya beralih ke Glassfish atau Payara, JBoss menjadi terlalu mahal! “, Kami mungkin bisa melakukannya, tapi itu bukan pekerjaan yang mudah.

Jika kami menyediakan implementasi kami sendiri, kami harus memastikan server tahu untuk mengecualikan miliknya - ini biasanya terjadi dengan memiliki file XML berpemilik di dalam yang dapat diterapkan. Tak perlu dikatakan, file seperti itu harus berisi semua jenis tag dan instruksi yang tidak diketahui siapa pun, kecuali para pengembang yang meninggalkan perusahaan tiga tahun lalu.

2.2. Selalu Ketahui Server Anda

Kami sejauh ini mengatakan bahwa kami harus memanfaatkan platform yang kami tawarkan.

Sebelum memutuskan server yang akan digunakan, kita harus melihat implementasi JAX-RS (nama, vendor, versi, dan bug yang diketahui) yang disediakannya, setidaknya untuk lingkungan Produksi. Misalnya, Glassfish hadir dengan Jersey, sedangkan Wildfly atau Jboss hadir dengan RESTEasy.

Ini, tentu saja, berarti sedikit waktu yang dihabiskan untuk penelitian, tetapi seharusnya dilakukan hanya sekali, di awal proyek atau saat memigrasi ke server lain.

3. Contoh

Jika Anda ingin mulai bermain dengan JAX-RS, jalur terpendeknya adalah: miliki proyek webapp Maven dengan dependensi berikut di pom.xml :

 javax javaee-api 7.0 provided  

Kami menggunakan JavaEE 7 karena sudah ada banyak server aplikasi yang menerapkannya. Jar API tersebut berisi anotasi yang perlu Anda gunakan, terletak di paket javax.ws.rs . Mengapa cakupan "disediakan"? Karena jar ini juga tidak perlu berada di build akhir - kita membutuhkannya pada waktu kompilasi dan ini disediakan oleh server untuk run time.

Setelah dependensi ditambahkan, pertama kita harus menulis kelas entri: kelas kosong yang memperluas javax.ws.rs.core.Application dan dianotasi dengan javax.ws.rs.ApplicationPath:

@ApplicationPath("/api") public class RestApplication extends Application { } 

Kami mendefinisikan jalur entri sebagai / api. Apa pun jalur lain yang kami nyatakan untuk sumber daya kami, jalur itu akan diawali dengan / api .

Selanjutnya, mari kita lihat sumber daya:

@Path("/notifications") public class NotificationsResource { @GET @Path("/ping") public Response ping() { return Response.ok().entity("Service online").build(); } @GET @Path("/get/{id}") @Produces(MediaType.APPLICATION_JSON) public Response getNotification(@PathParam("id") int id) { return Response.ok() .entity(new Notification(id, "john", "test notification")) .build(); } @POST @Path("/post/") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response postNotification(Notification notification) { return Response.status(201).entity(notification).build(); } }

Kami memiliki titik akhir ping sederhana untuk memanggil dan memeriksa apakah aplikasi kami berjalan, GET dan POST untuk Notifikasi (ini hanya POJO dengan atribut plus getter dan setter).

Terapkan perang ini pada server aplikasi apa pun yang menerapkan JEE7 dan perintah berikut akan berfungsi:

curl //localhost:8080/simple-jaxrs-ex/api/notifications/ping/ curl //localhost:8080/simple-jaxrs-ex/api/notifications/get/1 curl -X POST -d '{"id":23,"text":"lorem ipsum","username":"johana"}' //localhost:8080/simple-jaxrs-ex/api/notifications/post/ --header "Content-Type:application/json"

Dimana simple-jaxrs-ex adalah konteks-root dari webapp.

Ini diuji dengan Glassfish 4.1.0 dan Wildfly 9.0.1. Final. Harap dicatat bahwa dua perintah terakhir tidak akan berfungsi dengan Glassfish 4.1.1, karena bug ini. Tampaknya ini adalah masalah yang diketahui dalam versi Glassfish ini, terkait dengan serialisasi JSON (jika Anda harus menggunakan versi server ini, Anda harus mengelola penyusunan JSON sendiri)

4. Kesimpulan

Di akhir artikel ini, perlu diingat bahwa JAX-RS adalah API yang kuat dan sebagian besar (jika tidak semua) hal yang Anda butuhkan sudah diimplementasikan oleh server web Anda. Tidak perlu mengubah aplikasi Anda menjadi tumpukan perpustakaan yang tidak bisa dikelola.

Artikel ini menyajikan contoh sederhana dan segala sesuatunya mungkin menjadi lebih rumit. Misalnya, Anda mungkin ingin menulis marshaler Anda sendiri. Saat diperlukan, cari tutorial yang menyelesaikan masalah Anda dengan JAX-RS, bukan dengan Jersey, Resteasy, atau implementasi konkret lainnya. Kemungkinan besar masalah Anda dapat diselesaikan dengan satu atau dua anotasi.