之间的区别是什么@FormDataParam
和@FormParam
之间的区别?是什么@FormDataParam和@FormParam
我在一个方法中使用多个@FormDataParam
,但它抛出媒体不支持的类型错误。但是当我使用@FormParam
时,我得到了这些值。
所以,我需要知道他们两个之间有什么区别?
之间的区别是什么@FormDataParam
和@FormParam
之间的区别?是什么@FormDataParam和@FormParam
我在一个方法中使用多个@FormDataParam
,但它抛出媒体不支持的类型错误。但是当我使用@FormParam
时,我得到了这些值。
所以,我需要知道他们两个之间有什么区别?
@FormDataParam
应该与多部分类型的数据(即multipart/form-data
或MediaType.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-urlencoded
或MediaType.APPLICATION_FORM_URLENCODED
),其原始形式看起来像
param1=value1¶m2=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
参见:
是的,现在它的明确。但唯一我无法理解的是。我的表单没有使用'multipart/form-data'。当我只有一个参数时,仍然可以将字符串作为@FormDataParam。但是当我改变为两个参数时,它弯腰工作。将其更改为@FormParam后,它现在正在工作。 –
我想你的情况,'@ FormDataParam'被完全忽略,因为预期的媒体类型是'application/x-www-form-urlencoded'。至于传入的数据,由于不使用'@ FormParam',它只是将数据作为整个请求字符串。 –
至于“不工作”,因为一个方法可以接受一个身体参数,通常这个参数没有注释,就像获取JSON POJO时一样。如果您尝试添加一个参数,Jersey不知道哪一个是body参数,所以它在启动时会引发错误。如果您要在应用程序中注册'MultiPartFeature',Jersey不会抛出错误,因为该功能可以识别'@ FormDataParam'注释,所以它认为这就是您的期望。虽然我不确定反序列化是否会成功。 –
从文档FormParam:
包含在请求 实体主体内的形式参数的值(一个或多个)结合到资源的方法参数。除非使用Encoded注释禁用了这些值,否则URL被解码为 。默认值 可以使用DefaultValue批注指定。如果请求 实体正文不存在或者是不受支持的媒体类型,则使用默认的 值。
绑定一个“多部分/格式数据”请求实体 体到资源的方法参数的命名身体部分(一个或多个)。
FormDataParam与multipart/form-data结合使用。这是比使用FormParam传输二进制数据像附件更有效的方法。请[FormDataParam]的文档(https://jersey.java.net/nonav/apidocs/1.0.3/contribs/jersey-multipart/com/sun/jersey/multipart/FormDataParam.html) –