@POST
Metode Anda harus menerima objek JSON, bukan string. Jersey menggunakan JAXB untuk mendukung marshaling dan unmarshaling objek JSON (lihat dokumentasi jersey untuk detailnya ). Buat kelas seperti:
@XmlRootElement
public class MyJaxBean {
@XmlElement public String param1;
@XmlElement public String param2;
}
Kemudian Anda @POST
metode akan terlihat seperti berikut:
@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
System.out.println("param1 = " + input.param1);
System.out.println("param2 = " + input.param2);
}
Metode ini mengharapkan untuk menerima objek JSON sebagai badan HTTP POST. JAX-RS meneruskan isi pesan HTTP sebagai parameter tanpa pemberitahuan - input
dalam hal ini. Pesan sebenarnya akan terlihat seperti ini:
POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com
{"param1":"hello","param2":"world"}
Menggunakan JSON dengan cara ini cukup umum karena alasan yang jelas. Namun, jika Anda membuat atau mengkonsumsinya dalam sesuatu selain JavaScript, maka Anda harus berhati-hati untuk keluar dari data dengan benar. Di JAX-RS, Anda akan menggunakan MessageBodyReader dan MessageBodyWriter untuk mengimplementasikan ini. Saya percaya bahwa Jersey sudah memiliki implementasi untuk tipe yang dibutuhkan (misalnya, Java primitif dan kelas yang dibungkus JAXB) serta untuk JSON. JAX-RS mendukung sejumlah metode lain untuk meneruskan data. Ini tidak memerlukan pembuatan kelas baru karena data diteruskan menggunakan penerusan argumen sederhana.
HTML <FORM>
Parameter akan dianotasi menggunakan @FormParam :
@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
@FormParam("param2") String param2) {
...
}
Browser akan menyandikan formulir menggunakan "application / x-www-form-urlencoded" . Runtime JAX-RS akan menangani decoding tubuh dan meneruskannya ke metode. Inilah yang harus Anda lihat di kawat:
POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25
param1=hello¶m2=world
Konten tersebut dikodekan URL kasus ini, .
Jika Anda tidak mengetahui nama FormParam, Anda dapat melakukan hal berikut:
@POST @Consumes("application/x-www-form-urlencoded")
@Path("/create")
public void create(final MultivaluedMap<String, String> formParams) {
...
}
Header HTTP
Anda dapat menggunakan anotasi @HeaderParam jika Anda ingin meneruskan parameter melalui header HTTP:
@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
@HeaderParam("param2") String param2) {
...
}
Seperti inilah tampilan pesan HTTPnya. Perhatikan bahwa POST ini tidak memiliki badan.
POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world
Saya tidak akan menggunakan metode ini untuk melewatkan parameter umum. Ini sangat berguna jika Anda perlu mengakses nilai dari header HTTP tertentu.
Parameter Kueri HTTP
Metode ini terutama digunakan dengan HTTP GET tetapi juga berlaku untuk POST. Ini menggunakan anotasi @QueryParam .
@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
@QueryParam("param2") String param2) {
...
}
Seperti teknik sebelumnya, meneruskan parameter melalui string kueri tidak memerlukan badan pesan. Inilah pesan HTTPnya:
POST /create?param1=hello¶m2=world HTTP/1.1
Content-Length: 0
Host: www.example.com
Anda harus sangat berhati-hati untuk mengenkode parameter kueri dengan benar di sisi klien. Penggunaan parameter kueri dapat menimbulkan masalah karena batasan panjang URL yang diberlakukan oleh beberapa proxy serta masalah yang terkait dengan pengkodeannya.
Parameter Jalur HTTP
Parameter jalur mirip dengan parameter kueri kecuali bahwa parameter tersebut disematkan di jalur sumber daya HTTP. Metode ini tampaknya disukai hari ini. Ada dampak sehubungan dengan cache HTTP karena jalur itulah yang sebenarnya mendefinisikan sumber daya HTTP. Kode terlihat sedikit berbeda dari yang lain karena anotasi @Path diubah dan menggunakan @PathParam :
@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
@PathParam("param2") String param2) {
...
}
Pesan ini mirip dengan versi parameter kueri kecuali bahwa nama parameter tidak disertakan di mana pun dalam pesan.
POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com
Metode ini berbagi kesengsaraan encoding yang sama dengan versi parameter kueri. Segmen jalur dikodekan secara berbeda sehingga Anda juga harus berhati-hati di sana.
Seperti yang Anda lihat, ada pro dan kontra untuk setiap metode. Pilihan biasanya ditentukan oleh klien Anda. Jika Anda melayani FORM
halaman HTML berbasis, maka gunakan @FormParam
. Jika klien Anda berbasis JavaScript + HTML5, Anda mungkin ingin menggunakan serialisasi berbasis JAXB dan objek JSON. The MessageBodyReader/Writer
implementasi harus mengurus yang diperlukan melarikan diri untuk Anda sehingga adalah satu hal sedikit yang bisa salah. Jika klien Anda berbasis Java tetapi tidak memiliki prosesor XML yang baik (misalnya, Android), saya mungkin akan menggunakanFORM
pengkodean karena badan konten lebih mudah untuk dibuat dan dikodekan dengan benar daripada URL. Semoga entri wiki-mini ini menjelaskan beberapa metode yang didukung JAX-RS.
Catatan: untuk kepentingan pengungkapan penuh, saya belum benar-benar menggunakan fitur Jersey ini. Kami mengotak-atiknya karena kami memiliki sejumlah aplikasi JAXB + JAX-RS yang diterapkan dan pindah ke ruang klien seluler. JSON jauh lebih cocok daripada XML pada solusi berbasis HTML5 atau jQuery.