クラス FormHttpMessageConverter
- 実装されたすべてのインターフェース:
HttpMessageConverter<MultiValueMap<StringSE,
?>>
- 既知の直属サブクラス
AllEncompassingFormHttpMessageConverter
HttpMessageConverter
を実装して、「通常の」 HTML フォームを読み書きし、マルチパートデータ (ファイルのアップロードなど) を書き込む (読み取りは行わない) こともできます。 つまり、このコンバーターは "application/x-www-form-urlencoded"
メディア型を MultiValueMap<String, String>
として読み書きでき、"multipart/form-data"
および "multipart/mixed"
メディア型を MultiValueMap<String, Object>
として書き込むこともできます(ただし、読み取ることはできません)。
マルチパートデータ
デフォルトでは、マルチパートデータを書き込む際のコンテンツ型として "multipart/form-data"
が使用されます。マルチパートサブ型がサポートされているメディア型として登録され、マルチパートデータを書き込む際に目的のマルチパートサブ型がコンテンツ型として指定されている限り、"multipart/mixed"
や "multipart/related"
などの他のマルチパートサブ型を使用してマルチパートデータを書き込むこともできます。サポートされているメディア型として、デフォルトでは "multipart/mixed"
が登録されていることに注意してください。
マルチパートデータを書き込む場合、このコンバーターは他の HttpMessageConverters
を使用してそれぞれの MIME パートを書き込みます。デフォルトでは、基本配列はバイト配列 String
および Resource
に登録されています。これらは、setPartConverters(java.util.List<org.springframework.http.converter.HttpMessageConverter<?>>)
でオーバーライドするか、addPartConverter(org.springframework.http.converter.HttpMessageConverter<?>)
で拡張できます。
サンプル
次のスニペットは、"multipart/form-data"
コンテンツ型を使用して HTML フォームを送信する方法を示しています。
RestClient restClient = RestClient.create(); // AllEncompassingFormHttpMessageConverter is configured by default MultiValueMap<String, Object> form = new LinkedMultiValueMap<>(); form.add("field 1", "value 1"); form.add("field 2", "value 2"); form.add("field 2", "value 3"); form.add("field 3", 4); // non-String form values supported as of 5.1.4 ResponseEntity<Void> response = restClient.post() .uri("https://example.com/myForm") .contentType(MULTIPART_FORM_DATA) .body(form) .retrieve() .toBodilessEntity();
次のスニペットは、"multipart/form-data"
コンテンツ型を使用してファイルをアップロードする方法を示しています。
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); parts.add("field 1", "value 1"); parts.add("file", new ClassPathResource("myFile.jpg")); ResponseEntity<Void> response = restClient.post() .uri("https://example.com/myForm") .contentType(MULTIPART_FORM_DATA) .body(parts) .retrieve() .toBodilessEntity();
次のスニペットは、"multipart/mixed"
コンテンツ型を使用してファイルをアップロードする方法を示しています。
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); parts.add("field 1", "value 1"); parts.add("file", new ClassPathResource("myFile.jpg")); ResponseEntity<Void> response = restClient.post() .uri("https://example.com/myForm") .contentType(MULTIPART_MIXED) .body(form) .retrieve() .toBodilessEntity();
次のスニペットは、"multipart/related"
コンテンツ型を使用してファイルをアップロードする方法を示しています。
restClient = restClient.mutate() .messageConverters(l -> l.stream() .filter(FormHttpMessageConverter.class::isInstance) .map(FormHttpMessageConverter.class::cast) .findFirst() .orElseThrow(() -> new IllegalStateException("Failed to find FormHttpMessageConverter")) .addSupportedMediaTypes(MULTIPART_RELATED); MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); parts.add("field 1", "value 1"); parts.add("file", new ClassPathResource("myFile.jpg")); ResponseEntity<Void> response = restClient.post() .uri("https://example.com/myForm") .contentType(MULTIPART_RELATED) .body(form) .retrieve() .toBodilessEntity();
その他
このクラスの一部のメソッドは org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity
に触発されました。
- 導入:
- 3.0
- 作成者:
- Arjen Poutsma, Rossen Stoyanchev, Juergen Hoeller, Sam Brannen
- 関連事項:
フィールドサマリー
コンストラクターのサマリー
方法の概要
修飾子と型メソッド説明void
addPartConverter
(HttpMessageConverter<?> partConverter) メッセージ本文コンバーターを追加します。void
addSupportedMediaTypes
(MediaType... supportedMediaTypes) このコンバーターでサポートされるMediaType
オブジェクトを追加します。boolean
指定されたクラスがこのコンバーターで読み取れるかどうかを示します。boolean
指定されたクラスをこのコンバーターで書き込めるかどうかを示します。protected byte[]
マルチパート境界を生成します。protected StringSE
getFilename
(ObjectSE part) 指定されたマルチパートパーツのファイル名を返します。protected MediaType
getFormContentType
(MediaType contentType) フォームの書き込みに使用されるコンテンツ型 (指定されたコンテンツ型、またはapplication/x-www-form-urlencoded
) を返します。protected HttpEntity<?>
getHttpEntity
(ObjectSE part) 指定されたパーツオブジェクトのHttpEntity
を返します。MIME パーツ用に構成されたコンバーターを返します。このコンバーターでサポートされているメディア型のリストを返します。read
(ClassSE<? extends MultiValueMap<StringSE, ?>> clazz, HttpInputMessage inputMessage) 指定された入力メッセージから指定された型のオブジェクトを読み取り、それを返します。protected StringSE
serializeForm
(MultiValueMap<StringSE, ObjectSE> formData, CharsetSE charset) void
setCharset
(CharsetSE charset) リクエストまたはレスポンスContent-Type
ヘッダーで明示的に指定されていない場合に、フォームデータの読み取りおよび書き込みに使用するデフォルトの文字セットを設定します。void
setMultipartCharset
(CharsetSE charset) ファイル名をエンコードするマルチパートデータを書き込むときに使用する文字セットを設定します。void
setPartConverters
(ListSE<HttpMessageConverter<?>> partConverters) 使用するメッセージ本文コンバーターを設定します。void
setSupportedMediaTypes
(ListSE<MediaType> supportedMediaTypes) このコンバーターによってサポートされるMediaType
オブジェクトのリストを設定します。void
write
(MultiValueMap<StringSE, ?> map, MediaType contentType, HttpOutputMessage outputMessage) 指定されたオブジェクトを指定された出力メッセージに書き込みます。クラス java.lang.ObjectSE から継承されたメソッド
clone, equalsSE, finalize, getClass, hashCode, notify, notifyAll, toString, wait, waitSE, waitSE
インターフェース org.springframework.http.converter.HttpMessageConverter から継承されたメソッド
getSupportedMediaTypes
フィールドの詳細
DEFAULT_CHARSET
コンバーターが使用するデフォルトの文字セット。
コンストラクターの詳細
FormHttpMessageConverter
public FormHttpMessageConverter()
メソッドの詳細
setSupportedMediaTypes
このコンバーターによってサポートされるMediaType
オブジェクトのリストを設定します。addSupportedMediaTypes
このコンバーターでサポートされるMediaType
オブジェクトを追加します。提供された
MediaType
オブジェクトは、サポートされている MediaType オブジェクトのリストに追加されます。- パラメーター:
supportedMediaTypes
- 追加するMediaType
オブジェクトの var-args リスト- 導入:
- 5.2
- 関連事項:
getSupportedMediaTypes
このコンバーターでサポートされているメディア型のリストを返します。このリストは、考えられるすべてのターゲット要素型に適用されるとは限らないため、このメソッドの呼び出しは通常、canWrite(clazz, null
を介して保護する必要があります。このリストでは、特定のクラスでのみサポートされている MIME 型を除外することもできます。または、HttpMessageConverter.getSupportedMediaTypes(Class)
を使用してより正確なリストを作成します。- 次で指定:
- インターフェース
HttpMessageConverter<MultiValueMap<StringSE,
の?>> getSupportedMediaTypes
- 戻り値:
- サポートされているメディア型のリスト
- 関連事項:
setPartConverters
使用するメッセージ本文コンバーターを設定します。これらのコンバーターは、オブジェクトを MIME パーツに変換するために使用されます。getPartConverters
MIME パーツ用に構成されたコンバーターを返します。- 導入:
- 5.3
addPartConverter
メッセージ本文コンバーターを追加します。このようなコンバーターは、オブジェクトを MIME パーツに変換するために使用されます。setCharset
リクエストまたはレスポンスContent-Type
ヘッダーで明示的に指定されていない場合に、フォームデータの読み取りおよび書き込みに使用するデフォルトの文字セットを設定します。4.3 の時点で、これはマルチパートリクエストのテキスト本文の変換のデフォルトの文字セットとしても使用されます。
5.0 の時点で、これは、(相互に排他的な)
multipartCharset
も設定されていない限り、Content-Disposition
(およびそのファイル名パラメーター)を含むパーツヘッダーにも使用されます。この場合、パーツヘッダーは ASCII としてエンコードされ、 ファイル名は RFC 2047 のencoded-word
構文でエンコードされます。デフォルトでは、これは "UTF-8" に設定されています。
setMultipartCharset
ファイル名をエンコードするためにマルチパートデータを書き込むときに使用する文字セットを設定します。エンコードは、RFC 2047 で定義されているencoded-word
構文に基づいており、jakarta.mail
からのMimeUtility
に依存しています。5.0 のデフォルトでは、
Content-Disposition
(およびそのファイル名パラメーター)を含むパーツヘッダーは、デフォルトでsetCharset(Charset)
またはUTF-8
の設定に基づいてエンコードされます。- 導入:
- 4.1.1
- 関連事項:
canRead
インターフェースからコピーされた説明:HttpMessageConverter
指定されたクラスがこのコンバーターで読み取れるかどうかを示します。- 次で指定:
- インターフェース
HttpMessageConverter<MultiValueMap<StringSE,
の?>> canRead
- パラメーター:
clazz
- 読み込み可能性をテストするクラスmediaType
- 読み取るメディア型(指定しない場合はnull
にできます); 通常、Content-Type
ヘッダーの値。- 戻り値:
- 読み取り可能な場合は
true
。それ以外の場合はfalse
canWrite
インターフェースからコピーされた説明:HttpMessageConverter
指定されたクラスをこのコンバーターで書き込めるかどうかを示します。- 次で指定:
- インターフェース
HttpMessageConverter<MultiValueMap<StringSE,
の?>> canWrite
- パラメーター:
clazz
- 書き込み可能性をテストするクラスmediaType
- 書き込むメディア型(指定しない場合はnull
にすることができます); 通常、Accept
ヘッダーの値。- 戻り値:
- 書き込み可能な場合は
true
。それ以外の場合はfalse
read
public MultiValueMap<StringSE,StringSE> read(@Nullable ClassSE<? extends MultiValueMap<StringSE, ?>> clazz, HttpInputMessage inputMessage) throws IOExceptionSE, HttpMessageNotReadableExceptionインターフェースからコピーされた説明:HttpMessageConverter
指定された入力メッセージから指定された型のオブジェクトを読み取り、それを返します。- 次で指定:
- インターフェース
HttpMessageConverter<MultiValueMap<StringSE,
の?>> read
- パラメーター:
clazz
- 返すオブジェクトの型。この型は、このインターフェースのcanRead
メソッドに事前に渡されている必要があります。このメソッドはtrue
を返している必要があります。inputMessage
- 読み込む HTTP 入力メッセージ- 戻り値:
- 変換されたオブジェクト
- 例外:
IOExceptionSE
- I/O エラーの場合HttpMessageNotReadableException
- 変換エラーの場合
write
public void write(MultiValueMap<StringSE, ?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOExceptionSE, HttpMessageNotWritableExceptionインターフェースからコピーされた説明:HttpMessageConverter
指定されたオブジェクトを指定された出力メッセージに書き込みます。- 次で指定:
- インターフェース
HttpMessageConverter<MultiValueMap<StringSE,
の?>> write
- パラメーター:
map
- 出力メッセージに書き込むオブジェクト。このオブジェクトの型は、このインターフェースのcanWrite
メソッドに事前に渡されている必要があります。このメソッドはtrue
を返している必要があります。contentType
- 書き込み時に使用するコンテンツ型。コンバーターのデフォルトのコンテンツ型を使用する必要があることを示すnull
の場合があります。null
でない場合、このメディア型は、このインターフェースのcanWrite
メソッドに事前に渡されている必要があり、true
が返されている必要があります。outputMessage
- 書き込むメッセージ- 例外:
IOExceptionSE
- I/O エラーの場合HttpMessageNotWritableException
- 変換エラーの場合
getFormContentType
フォームの書き込みに使用されるコンテンツ型 (指定されたコンテンツ型、またはapplication/x-www-form-urlencoded
) を返します。- パラメーター:
contentType
-write(org.springframework.util.MultiValueMap<java.lang.String, ?>, org.springframework.http.MediaType, org.springframework.http.HttpOutputMessage)
またはnull
に渡されるコンテンツ型- 戻り値:
- 使用するコンテンツ型
- 導入:
- 5.2.2
serializeForm
generateMultipartBoundary
protected byte[] generateMultipartBoundary()マルチパート境界を生成します。この実装は
MimeTypeUtils.generateMultipartBoundary()
に委譲します。getHttpEntity
指定されたパーツオブジェクトのHttpEntity
を返します。- パラメーター:
part
-HttpEntity
を返す部分- 戻り値:
- パーツオブジェクト自体は
HttpEntity
、またはそのパーツ用に新しく構築されたHttpEntity
ラッパー
getFilename
指定されたマルチパートパーツのファイル名を返します。この値はContent-Disposition
ヘッダーに使用されます。デフォルトの実装は、パーツが
Resource
の場合はResource.getFilename()
を返し、それ以外の場合はnull
を返します。サブクラスでオーバーライドできます。- パラメーター:
part
- ファイル名を決定する部分- 戻り値:
- ファイル名、または不明の場合は
null