@FormDataParam和@FormParam有什么区别

时间:2016-05-31 05:39:59

标签: java jersey jax-rs multipartform-data

@FormDataParam@FormParam之间的区别是什么?

我在一个方法中使用了多个@FormDataParam,但它丢弃了媒体不支持的类型错误。但是当我使用@FormParam时,我得到了值。

所以,我需要知道他们俩之间的区别是什么?

2 个答案:

答案 0 :(得分:14)

  • @FormDataParam应与多部分类型数据(即multipart/form-dataMediaType.MULTIPART_FORM_DATA)一起使用,其原始形式类似于

    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主要用于发送二进制数据,如非文本文件。

  • @FormParam用于网址编码的请求参数(即application/x-www-form-urlencodedMediaType.APPLICATION_FORM_URLENCODED),原始格式如下

    param1=value1&param2=value2
    

这两种类型主要用于客户端表单。例如

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

以上会将请求参数发送为application/x-www-form-urlencoded。它将以原始形式发送

gender=male&name=peeskillet

在服务器端,我们可以为表单

中的每个命名参数使用@FormParam
@FormParam("gender") String gender, @FormParam("name") String name

但是如果我们需要发送一个图像和参数,application/x-form-url-encoded数据类型是不够的,因为它只处理文本。所以我们需要使用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>

这里指定了Multipart类型,现在浏览器将发送带有类似

的请求
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--

在服务器上,与上面的application/x-www-form-urlencoded示例类似,对于每个Multipart参数(或更准确的字段),我们可以使用@FormDataParam来表示每个参数

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

另见:

答案 1 :(得分:1)

来自文档FormParam

  

绑定请求中包含的表单参数的值   实体主体到资源方法参数。值是URL解码的   除非使用编码注释禁用此功能。默认值   可以使用DefaultValue批注指定。如果请求   实体主体不存在或是不受支持的媒体类型,默认情况下   使用了价值。

FormDataParam

  

绑定&#34; multipart / form-data&#34;的命名正文部分。请求实体   body到资源方法参数。