2016-05-31 30 views
8

Sự khác nhau giữa @FormDataParam@FormParam là gì?Sự khác nhau giữa @FormDataParam và @FormParam

Tôi đã sử dụng nhiều @FormDataParam trong một phương pháp nhưng nó đã ném lỗi loại phương tiện không được hỗ trợ. Nhưng khi tôi sử dụng @FormParam, tôi đã nhận được các giá trị.

Vì vậy, tôi cần biết sự khác biệt giữa hai người trong số họ là gì?

+0

FormDataParam được sử dụng kết hợp với multipart/form-data. Đây là phương pháp hiệu quả hơn để truyền dữ liệu nhị phân như tệp đính kèm hơn là sử dụng FormParam. Xin vui lòng các tài liệu của [FormDataParam] (https://jersey.java.net/nonav/apidocs/1.0.3/contribs/jersey-multipart/com/sun/jersey/multipart/FormDataParam.html) –

Trả lời

8
  • @FormDataParam là nghĩa vụ phải được sử dụng với kiểu dữ liệu dung nhiều (ví dụ multipart/form-data hoặc MediaType.MULTIPART_FORM_DATA), mà dưới dạng thô trông giống như

    Content-Type: multipart/form-data; boundary=AaB03x 
    
    --AaB03x 
    Content-Disposition: form-data; name="submit-name" 
    
    Larry 
    --AaB03x 
    Content-Disposition: form-data; name="files"; filename="file1.txt" 
    Content-Type: text/plain 
    
    ... contents of file1.txt ... 
    --AaB03x-- 
    

    Multipart được sử dụng chủ yếu cho việc gửi dữ liệu nhị phân, giống như không -text tập tin.

  • @FormParam là cho thông số yêu cầu url-mã hóa (ví dụ: application/x-www-form-urlencoded hoặc MediaType.APPLICATION_FORM_URLENCODED), mà ở dạng thô trông giống như

    param1=value1&param2=value2 
    

Cả hai loại được sử dụng chủ yếu trong các hình thức phía khách hàng. Ví dụ:

<form method="POST" action="someUrl"> 
    <input name="gender" type="text"> 
    <input name="name" type="text"> 
</form> 

ở trên sẽ gửi thông số yêu cầu là application/x-www-form-urlencoded. Nó sẽ được gửi ở dạng thô như

gender=male&name=peeskillet 

Về phía server, chúng ta có thể sử dụng một @FormParam cho mỗi tham số được đặt tên theo hình thức

@FormParam("gender") String gender, @FormParam("name") String name 

Nhưng nếu chúng ta cần phải gửi nói hình ảnh bên dưới các tham số, application/x-form-url-encoded loại dữ liệu không đủ, vì nó chỉ đề cập đến văn bản ASCII. Vì vậy, chúng ta cần phải sử dụng Multipart

<form method="POST" action="someUrl", enctype="multipart/form-data"> 
    <input name="gender" type="text"> 
    <input name="name" type="text"> 
    <input name="avatar" type="file"> 
</form> 

Đây là loại Multipart được chỉ định, bây giờ là trình duyệt sẽ gửi yêu cầu với một cái gì đó giống như

Content-Type: multipart/form-data; boundary=AaB03x 

--AaB03x 
Content-Disposition: form-data; name="gender" 

Male 
--AaB03x 
Content-Disposition: form-data; name="name" 

Peskillet 
--AaB03x 
Content-Disposition: form-data; name="avatar"; filename="image.png" 
Content-Type: image/png 

... binary content of image file ... 
--AaB03x-- 

Trên máy chủ, tương tự với ví dụ application/x-www-form-urlencoded trên, cho mỗi tham số Multipart (hoặc lĩnh vực được chính xác hơn), chúng ta có thể sử dụng để biểu thị @FormDataParam mỗi tham số

@FormDataParam("gender") String gender, 
@FormDataParam("name") String name, 
@FormDataParam("avatar") InputStream avatar 

Xem thêm:

+0

Có, bây giờ của nó thông thoáng. Nhưng điều duy nhất tôi không thể hiểu được là vậy. Biểu mẫu của tôi không sử dụng 'multipart/form-data'. Tôi vẫn có thể nhận được chuỗi như @FormDataParam khi tôi chỉ có một tham số. Nhưng khi tôi thay đổi thành hai tham số thì nó hoạt động. Sau khi thay đổi nó thành @FormParam, nó đang hoạt động. –

+1

Tôi nghĩ trong trường hợp của bạn, '@ FormDataParam' hoàn toàn bị bỏ qua vì loại phương tiện được mong đợi, là' application/x-www-form-urlencoded'. Đối với dữ liệu đến, vì '@ FormParam' không được sử dụng, nó chỉ cung cấp cho bạn dữ liệu làm chuỗi yêu cầu toàn bộ. –

+0

Theo như "không hoạt động", bởi vì một phương thức có thể chấp nhận một tham số của cơ thể, thông thường tham số này không có chú thích, giống như khi nhận được một POJO JSON. Nếu bạn cố gắng thêm một tham số nữa, Jersey không biết cái nào là tham số cơ thể, do đó nó sẽ phát ra lỗi khi khởi động. Nếu bạn đăng ký 'MultiPartFeature' với ứng dụng của mình, Jersey sẽ không ném lỗi, vì tính năng này nhận ra các chú thích' @ FormDataParam', vì vậy nó nghĩ đó là những gì bạn đang mong đợi. Mặc dù tôi không chắc chắn là việc deserialization sẽ thành công. –

1

Từ các tài liệu FormParam:

liên kết với các giá trị (s) của một tham số hình thức chứa trong một cơ thể thực thể yêu cầu đến một phương pháp tài nguyên tham số. Giá trị được giải mã URL trừ khi điều này bị vô hiệu hóa bằng cách sử dụng chú thích được mã hóa.Giá trị mặc định có thể được chỉ định bằng chú thích DefaultValue. Nếu yêu cầu nội dung thực thể không có hoặc là loại phương tiện không được hỗ trợ, giá trị mặc định được sử dụng.

FormDataParam

liên kết với các phần cơ thể được đặt tên (s) của một "multipart/form-data" Yêu cầu tổ chức cơ thể để một tham số phương pháp tài nguyên.

Các vấn đề liên quan