web-dev-qa-db-ja.com

@FormDataParamと@FormParamの違いは何ですか

@FormDataParam@FormParamの違いは何ですか?

メソッドで複数の@FormDataParamを使用していましたが、サポートされていないメディアタイプエラーをスローしていました。しかし、@FormParamを使用すると、値が得られました。

だから、それらの2つの違いは何ですか?

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

関連項目:

16
Paul Samsotha

ドキュメントから FormParam

リクエストエンティティボディに含まれるフォームパラメータの値をリソースメソッドパラメータにバインドします。 Encodedアノテーションを使用して無効にしない限り、値はURLデコードされます。デフォルト値は、DefaultValueアノテーションを使用して指定できます。要求エンティティ本体が存在しないか、サポートされていないメディアタイプである場合、デフォルト値が使用されます。

および FormDataParam

「multipart/form-data」リクエストエンティティボディの名前付きボディパーツをリソースメソッドパラメータにバインドします。

1
Rahul Tripathi