В чем разница между @FormDataParam и @FormParam

в чем разница между @FormDataParam и @FormParam?

я использовал несколько @FormDataParam в методе, но он бросал неподдерживаемую ошибку типа носителя. Но когда я использовал @FormParam, Я получил значения.

Итак, мне нужно знать, в чем разница между ними двумя?

2 ответов


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

    Multipart в основном используется для отправки двоичных данных, таких как нетекстовые файлы.

  • @FormParam для параметров запроса в кодировке url (т. е. application/x-www-form-urlencoded или MediaType.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

Читайте Также:


из документации FormParam:

связывает значение(ы) параметра формы, содержащегося в запросе тело сущности для параметра метода ресурса. Значения URL-адресов декодируется если это не отключено с помощью закодированной аннотации. Значение по умолчанию можно указать с помощью аннотации DefaultValue. Если запрос тело сущности отсутствует или является неподдерживаемым типом носителя, по умолчанию используется значение.

и FormDataParam

связывает именованные части тела объекта запроса " multipart / form-data тело к параметру метода ресурса.