Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @FormDataParam和@FormParam有什么区别_Java_Jersey_Jax Rs_Multipartform Data - Fatal编程技术网

Java @FormDataParam和@FormParam有什么区别

Java @FormDataParam和@FormParam有什么区别,java,jersey,jax-rs,multipartform-data,Java,Jersey,Jax Rs,Multipartform Data,@FormDataParam和@FormParam之间有什么区别 我在一个方法中使用了多个@FormDataParam,但它抛出了媒体不支持的类型错误。但是当我使用@FormParam时,我得到了值 所以,我需要知道它们之间的区别是什么? @FormDataParam应与多部分类型数据(即多部分/表单数据或MediaType.Multipart\u表单数据)一起使用,其原始形式类似于 内容类型:多部分/表单数据;边界=AaB03x --AaB03x 内容配置:表单数据;name=“提交名称” 拉

@FormDataParam
@FormParam
之间有什么区别

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

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

  • @FormDataParam
    应与多部分类型数据(即
    多部分/表单数据
    MediaType.Multipart\u表单数据
    )一起使用,其原始形式类似于

    内容类型:多部分/表单数据;边界=AaB03x
    --AaB03x
    内容配置:表单数据;name=“提交名称”
    拉里
    --AaB03x
    内容配置:表单数据;name=“文件”;filename=“file1.txt”
    内容类型:文本/纯文本
    ... file1.txt的内容。。。
    --AaB03x--
    
    Multipart主要用于发送二进制数据,如非文本文件

  • @FormParam
    用于url编码的请求参数(即
    application/x-www-form-urlencoded
    MediaType.application\u form\u urlencoded
    ),其原始形式如下

    param1=value1&param2=value2
    
这两种类型主要用于客户端表单。比如说

<form method="POST" action="someUrl">
    <input name="gender" type="text">
    <input name="name" type="text">
</form>
在服务器端,我们可以对表单中的每个命名参数使用
@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>
在服务器上,与上面的
应用程序/x-www-form-urlencoded
示例类似,对于每个多部分参数(更精确地说是字段),我们可以使用
@FormDataParam
表示每个参数

@FormDataParam("gender") String gender,
@FormDataParam("name") String name,
@FormDataParam("avatar") InputStream avatar
另请参见:

来自文档:

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

绑定“多部分/表单数据”请求实体的命名正文部分 将主体设置为资源方法参数


FormDataParam与多部分/表单数据一起使用。这是比使用FormParam更有效的方法来传输附件之类的二进制数据。是的,现在它清楚了。但我唯一不能理解的是。我的表单未使用
多部分/表单数据
。尽管如此,当我只有一个参数时,我仍然能够以@FormDataParam的形式获取字符串。但当我改为双参数时,它就开始工作了。将其更改为@FormParam后,它现在可以工作了。我认为在您的情况下,
@FormDataParam
被完全忽略,因为预期的媒体类型是
application/x-www-form-urlencoded
。至于传入的数据,因为没有使用
@FormParam
,它只是将数据作为整个请求字符串提供给您。至于“不工作”,是因为一个方法可以接受一个body参数,通常这个参数没有注释,比如在获取JSON POJO时。如果您尝试再添加一个参数,Jersey不知道哪一个是body参数,因此它在启动时抛出一个错误。如果要在应用程序中注册
MultiPartFeature
,Jersey不会抛出错误,因为该功能可以识别
@FormDataParam
注释,因此它认为这是您所期望的。虽然我不确定反序列化是否会成功。您可以看到
@FormDataParam("gender") String gender,
@FormDataParam("name") String name,
@FormDataParam("avatar") InputStream avatar