@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--
マルチパートは、主に非テキストファイルなどのバイナリデータの送信に使用されます。
@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 :
リクエストエンティティボディに含まれるフォームパラメータの値をリソースメソッドパラメータにバインドします。 Encodedアノテーションを使用して無効にしない限り、値はURLデコードされます。デフォルト値は、DefaultValueアノテーションを使用して指定できます。要求エンティティ本体が存在しないか、サポートされていないメディアタイプである場合、デフォルト値が使用されます。
および FormDataParam
「multipart/form-data」リクエストエンティティボディの名前付きボディパーツをリソースメソッドパラメータにバインドします。