В чем разница между @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¶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
для каждого именованного параметра в форме
@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. Если запрос тело сущности отсутствует или является неподдерживаемым типом носителя, по умолчанию используется значение.
связывает именованные части тела объекта запроса " multipart / form-data тело к параметру метода ресурса.