1. Gambaran keseluruhan
Paradigma REST telah wujud selama beberapa tahun sekarang dan masih mendapat banyak perhatian.
API RESTful dapat dilaksanakan di Java dengan beberapa cara: anda boleh menggunakan Spring, JAX-RS, atau anda mungkin hanya menulis servlet telanjang anda sendiri jika anda cukup baik dan berani. Yang anda perlukan hanyalah kemampuan untuk mendedahkan kaedah HTTP - selebihnya adalah mengenai bagaimana anda mengaturnya dan bagaimana anda membimbing klien ketika membuat panggilan ke API anda.
Seperti yang anda dapat lihat dari tajuk, artikel ini akan merangkumi JAX-RS. Tetapi apa artinya "hanya API"? Ini bermaksud bahawa fokus di sini adalah untuk menjelaskan kekeliruan antara JAX-RS dan pelaksanaannya dan menawarkan contoh bagaimana rupa webapp JAX-RS yang tepat.
2. Kemasukan dalam Java EE
JAX-RS tidak lebih dari spesifikasi, sekumpulan antara muka dan anotasi yang ditawarkan oleh Java EE. Dan tentu saja, kita mempunyai pelaksanaan; beberapa yang lebih terkenal adalah RESTEasy dan Jersey.
Juga, jika anda pernah memutuskan untuk membina pelayan aplikasi yang mematuhi JEE, orang-orang dari Oracle akan memberitahu anda bahawa, antara lain, pelayan anda harus menyediakan pelaksanaan JAX-RS untuk digunakan oleh aplikasi yang digunakan. Itulah sebabnya ia dipanggil Java Enterprise Edition Platform .
Satu lagi contoh spesifikasi dan pelaksanaan yang baik adalah JPA dan Hibernate.
2.1. Perang Ringan
Oleh itu, bagaimana semua ini dapat membantu kita, para pembangun? Bantuannya adalah kerana kami yang dapat menggunakan dapat dan sangat tipis, membiarkan pelayan aplikasi menyediakan perpustakaan yang diperlukan. Ini berlaku ketika mengembangkan RESTful API juga: artifak akhir tidak boleh mengandungi maklumat mengenai pelaksanaan JAX-RS yang digunakan.
Sudah tentu, kami dapat menyediakan pelaksanaannya (inilah tutorial untuk RESTeasy). Tetapi kemudian kita tidak dapat memanggil aplikasi kita "aplikasi Java EE" lagi. Sekiranya esok ada yang datang dan berkata " Ok, masa untuk beralih ke Glassfish atau Payara, JBoss menjadi terlalu mahal! ", Kita mungkin dapat melakukannya, tetapi itu bukan pekerjaan yang mudah.
Sekiranya kita menyediakan pelaksanaannya sendiri, kita harus memastikan pelayan tahu untuk mengecualikannya sendiri - ini biasanya berlaku dengan mempunyai fail XML milik di dalam yang dapat digunakan. Tidak perlu dikatakan, fail seperti itu harus mengandungi pelbagai jenis tag dan arahan yang tidak diketahui oleh siapa pun, kecuali pembangun yang meninggalkan syarikat itu tiga tahun lalu.
2.2. Sentiasa Tahu Pelayan Anda
Kami mengatakan sejauh ini bahawa kami harus memanfaatkan platform yang kami tawarkan.
Sebelum memutuskan pelayan untuk digunakan, kita harus melihat apa pelaksanaan JAX-RS (nama, vendor, versi dan bug yang diketahui) yang disediakannya, paling tidak untuk lingkungan Pengeluaran. Sebagai contoh, Glassfish dilengkapi dengan Jersey, sementara Wildfly atau Jboss hadir dengan RESTEasy.
Ini tentu saja bermaksud sedikit masa yang dihabiskan untuk penyelidikan, tetapi ia seharusnya dilakukan hanya sekali, pada awal projek atau ketika memindahkannya ke pelayan lain.
3. Contoh
Sekiranya anda ingin mula bermain dengan JAX-RS, jalan terpendek adalah: mempunyai projek webapp Maven dengan ketergantungan berikut di pom.xml :
javax javaee-api 7.0 provided
Kami menggunakan JavaEE 7 kerana sudah ada banyak pelayan aplikasi yang menerapkannya. Jar API itu mengandungi anotasi yang perlu anda gunakan, terletak di pakej javax.ws.rs . Mengapa ruang lingkup "disediakan"? Oleh kerana balang ini tidak perlu berada dalam binaan akhir - kami memerlukannya pada waktu penyusunan dan ia disediakan oleh pelayan untuk masa jalan.
Selepas kebergantungan ditambahkan, pertama kita harus menulis kelas entri: kelas kosong yang memanjangkan javax.ws.rs.core. Aplikasi dan diberi penjelasan dengan javax.ws.rs.ApplicationPath:
@ApplicationPath("/api") public class RestApplication extends Application { }
Kami menentukan jalan masuk sebagai / api. Apa sahaja jalan lain yang kami nyatakan untuk sumber kami, mereka akan diawali dengan / api .
Seterusnya, mari lihat sumber:
@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 mempunyai titik akhir ping yang mudah untuk dipanggil dan memeriksa apakah aplikasi kami berjalan, GET dan POST untuk Pemberitahuan (ini hanya POJO dengan atribut ditambah getter dan setter).
Terapkan perang ini ke mana-mana pelayan aplikasi yang melaksanakan JEE7 dan arahan 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"
Di mana simple-jaxrs-ex adalah akar konteks webapp.
Ini diuji dengan Glassfish 4.1.0 dan Wildfly 9.0.1.Final. Harap diperhatikan bahawa dua perintah terakhir tidak akan berfungsi dengan Glassfish 4.1.1, kerana bug ini. Nampaknya ini adalah masalah yang diketahui dalam versi Glassfish ini, mengenai siri JSON (jika anda harus menggunakan versi pelayan ini, anda harus menguruskan sendiri marshaling JSON)
4. Kesimpulan
Pada akhir artikel ini, ingatlah bahawa JAX-RS adalah API yang hebat dan sebahagian besar (jika tidak semua) perkara yang anda perlukan sudah dilaksanakan oleh pelayan web anda. Tidak perlu mengubah penggunaan anda menjadi tumpukan perpustakaan yang tidak dapat dikendalikan.
Penulisan ini memberikan contoh mudah dan perkara mungkin menjadi lebih rumit. Contohnya, anda mungkin mahu menulis pengedar anda sendiri. Apabila itu diperlukan, cari tutorial yang menyelesaikan masalah anda dengan JAX-RS, bukan dengan Jersey, Resteasy atau pelaksanaan konkrit lain. Kemungkinan masalah anda dapat diselesaikan dengan satu atau dua anotasi.