2016-05-31 376 views
8

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

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

所以,我需要知道他们两个之间有什么区别?

+0

FormDataParam与multipart/form-data结合使用。这是比使用FormParam传输二进制数据像附件更有效的方法。请[FormDataParam]的文档(https://jersey.java.net/nonav/apidocs/1.0.3/contribs/jersey-multipart/com/sun/jersey/multipart/FormDataParam.html) –

回答

8
  • @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-- 
    

    多部分主要用于发送二进制数据,如非文本文件。

  • @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("gender") String gender, @FormParam("name") String name 

使用@FormParam每个命名参数,但如果我们需要派说,随着图像参数application/x-form-url-encoded数据类型是不够的,因为它只处理ASCII文本。因此,我们需要使用多部分

<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> 

这里的多部分类型被指定,现在浏览器会发出请求的东西,如

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例如类似上面,对于每个多部分参数(或场更精确),我们可以使用@FormDataParam来表示每个参数

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

参见:

+0

是的,现在它的明确。但唯一我无法理解的是。我的表单没有使用'multipart/form-data'。当我只有一个参数时,仍然可以将字符串作为@FormDataParam。但是当我改变为两个参数时,它弯腰工作。将其更改为@FormParam后,它现在正在工作。 –

+1

我想你的情况,'@ FormDataParam'被完全忽略,因为预期的媒体类型是'application/x-www-form-urlencoded'。至于传入的数据,由于不使用'@ FormParam',它只是将数据作为整个请求字符串。 –

+0

至于“不工作”,因为一个方法可以接受一个身体参数,通常这个参数没有注释,就像获取JSON POJO时一样。如果您尝试添加一个参数,Jersey不知道哪一个是body参数,所以它在启动时会引发错误。如果您要在应用程序中注册'MultiPartFeature',Jersey不会抛出错误,因为该功能可以识别'@ FormDataParam'注释,所以它认为这就是您的期望。虽然我不确定反序列化是否会成功。 –

1

从文档FormParam

包含在请求 实体主体内的形式参数的值(一个或多个)结合到资源的方法参数。除非使用Encoded注释禁用了这些值,否则URL被解码为 。默认值 可以使用DefaultValue批注指定。如果请求 实体正文不存在或者是不受支持的媒体类型,则使用默认的 值。

FormDataParam

绑定一个“多部分/格式数据”请求实体 体到资源的方法参数的命名身体部分(一个或多个)。