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

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

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

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

Ответ 1

  • @FormDataParam предполагается использовать с данными типа Multipart (т.е. 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

Смотрите также:

Ответ 2

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

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

и FormDataParam

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