@FormDataParam和@FormParam有什么区别

2022-09-02 09:30:34

和 有什么区别?@FormDataParam@FormParam

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

那么,我需要知道他们两者之间有什么区别?


答案 1
  • @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用于 url 编码的请求参数(即 或 ),其原始形式看起来像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

<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

另请参阅:


答案 2

从文档 FormParam 中

将请求实体正文中包含的表单参数的值绑定到资源方法参数。除非使用编码批注禁用此操作,否则将对值进行 URL 解码。可以使用默认值批注指定默认值。如果请求实体正文不存在或属于不受支持的媒体类型,则使用默认值。

FormDataParam

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