public class FormHttpMessageConverter extends ObjectSE implements HttpMessageConverter<MultiValueMap<StringSE,?>>
HttpMessageConverter の実装により、「通常の」HTML フォームの読み取りと書き込み、およびマルチパートデータの書き込み(読み取りは不可)(ファイルのアップロードなど)を行うことができます。 つまり、このコンバーターは "application/x-www-form-urlencoded" メディア型を MultiValueMap<String, String> として読み書きでき、"multipart/form-data" および "multipart/mixed" メディア型を MultiValueMap<String, Object> として書き込むこともできます(ただし、読み取ることはできません)。
デフォルトでは、マルチパートデータを書き込むときのコンテンツ型として "multipart/form-data" が使用されます。Spring Framework 5.2 以降、マルチパートサブ型がサポートされているメディア型および目的のマルチパートとして登録されている限り、"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 フォームを送信する方法を示しています。
RestTemplate restTemplate = new RestTemplate();
// 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
restTemplate.postForLocation("https://example.com/myForm", form); 次のスニペットは、"multipart/form-data" コンテンツ型を使用してファイルをアップロードする方法を示しています。
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("field 1", "value 1");
parts.add("file", new ClassPathResource("myFile.jpg"));
restTemplate.postForLocation("https://example.com/myFileUpload", parts); 次のスニペットは、"multipart/mixed" コンテンツ型を使用してファイルをアップロードする方法を示しています。
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("field 1", "value 1");
parts.add("file", new ClassPathResource("myFile.jpg"));
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_MIXED);
restTemplate.postForLocation("https://example.com/myFileUpload",
new HttpEntity<>(parts, requestHeaders)); 次のスニペットは、"multipart/related" コンテンツ型を使用してファイルをアップロードする方法を示しています。
MediaType multipartRelated = new MediaType("multipart", "related");
restTemplate.getMessageConverters().stream()
.filter(FormHttpMessageConverter.class::isInstance)
.map(FormHttpMessageConverter.class::cast)
.findFirst()
.orElseThrow(() -> new IllegalStateException("Failed to find FormHttpMessageConverter"))
.addSupportedMediaTypes(multipartRelated);
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
parts.add("field 1", "value 1");
parts.add("file", new ClassPathResource("myFile.jpg"));
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(multipartRelated);
restTemplate.postForLocation("https://example.com/myFileUpload",
new HttpEntity<>(parts, requestHeaders)); このクラスの一部のメソッドは org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity に触発されました。
AllEncompassingFormHttpMessageConverter, MultiValueMap| 修飾子と型 | フィールドと説明 |
|---|---|
static CharsetSE | DEFAULT_CHARSET コンバーターが使用するデフォルトの文字セット。 |
| コンストラクターと説明 |
|---|
FormHttpMessageConverter() |
| 修飾子と型 | メソッドと説明 |
|---|---|
void | addPartConverter(HttpMessageConverter<?> partConverter) メッセージ本文コンバーターを追加します。 |
void | addSupportedMediaTypes(MediaType... supportedMediaTypes) このコンバーターでサポートされる MediaType オブジェクトを追加します。 |
boolean | canRead(ClassSE<?> clazz, MediaType mediaType) 指定されたクラスがこのコンバーターで読み取れるかどうかを示します。 |
boolean | canWrite(ClassSE<?> clazz, MediaType mediaType) 指定されたクラスをこのコンバーターで書き込めるかどうかを示します。 |
protected byte[] | generateMultipartBoundary() マルチパート境界を生成します。 |
protected StringSE | getFilename(ObjectSE part) 指定されたマルチパートパーツのファイル名を返します。 |
protected MediaType | getFormContentType(MediaType contentType) 優先コンテンツ型を指定して、フォームの作成に使用されるコンテンツ型を返します。 |
protected HttpEntity<?> | getHttpEntity(ObjectSE part) 指定されたパーツオブジェクトの HttpEntity を返します。 |
ListSE<HttpMessageConverter<?>> | getPartConverters()MIME パーツ用に構成されたコンバーターを返します。 |
ListSE<MediaType> | getSupportedMediaTypes() このコンバーターでサポートされているメディア型のリストを返します。 |
MultiValueMap<StringSE, StringSE> | 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) 指定されたオブジェクトを指定された出力メッセージに書き込みます。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSEgetSupportedMediaTypespublic static final CharsetSE DEFAULT_CHARSET
public void setSupportedMediaTypes(ListSE<MediaType> supportedMediaTypes)
MediaType オブジェクトのリストを設定します。public void addSupportedMediaTypes(MediaType... supportedMediaTypes)
MediaType オブジェクトを追加します。 提供された MediaType オブジェクトは、サポートされている MediaType オブジェクトのリストに追加されます。
supportedMediaTypes - 追加する MediaType オブジェクトの var-args リスト setSupportedMediaTypes(List)public ListSE<MediaType> getSupportedMediaTypes()
canWrite(clazz, null を介して保護する必要があります。このリストでは、特定のクラスでのみサポートされている MIME 型を除外することもできます。または、HttpMessageConverter.getSupportedMediaTypes(Class) を使用してより正確なリストを作成します。HttpMessageConverter<MultiValueMap<StringSE,?>> の getSupportedMediaTypes setSupportedMediaTypes(List), addSupportedMediaTypes(MediaType...)public void setPartConverters(ListSE<HttpMessageConverter<?>> partConverters)
public ListSE<HttpMessageConverter<?>> getPartConverters()
public void addPartConverter(HttpMessageConverter<?> partConverter)
public void setCharset(@Nullable CharsetSE charset)
Content-Type ヘッダーで明示的に指定されていない場合に、フォームデータの読み取りおよび書き込みに使用するデフォルトの文字セットを設定します。4.3 の時点で、これはマルチパートリクエストのテキスト本文の変換のデフォルトの文字セットとしても使用されます。
5.0 の時点で、これは、(相互に排他的な)multipartCharset も設定されていない限り、Content-Disposition (およびそのファイル名パラメーター)を含むパーツヘッダーにも使用されます。この場合、パーツヘッダーは ASCII としてエンコードされ、 ファイル名は RFC 2047 の encoded-word 構文でエンコードされます。
デフォルトでは、これは "UTF-8" に設定されています。
public void setMultipartCharset(CharsetSE charset)
encoded-word 構文に基づいており、javax.mail からの MimeUtility に依存しています。5.0 のデフォルトでは、Content-Disposition (およびそのファイル名パラメーター)を含むパーツヘッダーは、デフォルトで setCharset(Charset) または UTF-8 の設定に基づいてエンコードされます。
public boolean canRead(ClassSE<?> clazz, @Nullable MediaType mediaType)
HttpMessageConverterHttpMessageConverter<MultiValueMap<StringSE,?>> の canRead clazz - 読み込み可能性をテストするクラス mediaType - 読み取るメディア型(指定しない場合は null にできます); 通常、Content-Type ヘッダーの値。true。それ以外の場合は false public boolean canWrite(ClassSE<?> clazz, @Nullable MediaType mediaType)
HttpMessageConverterHttpMessageConverter<MultiValueMap<StringSE,?>> の canWrite clazz - 書き込み可能性をテストするクラス mediaType - 書き込むメディア型(指定しない場合は null にすることができます); 通常、Accept ヘッダーの値。true。それ以外の場合は false public MultiValueMap<StringSE,StringSE> read(@Nullable ClassSE<? extends MultiValueMap<StringSE,?>> clazz, HttpInputMessage inputMessage) throws IOExceptionSE, HttpMessageNotReadableException
HttpMessageConverterHttpMessageConverter<MultiValueMap<StringSE,?>> の read clazz - 返すオブジェクトの型。この型は、このインターフェースの canRead メソッドに事前に渡されている必要があります。このメソッドは true を返している必要があります。inputMessage - 読み込む HTTP 入力メッセージ IOExceptionSE - I/O エラーの場合 HttpMessageNotReadableException - 変換エラーの場合 public void write(MultiValueMap<StringSE,?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOExceptionSE, HttpMessageNotWritableException
HttpMessageConverterHttpMessageConverter<MultiValueMap<StringSE,?>> の write map - 出力メッセージに書き込むオブジェクト。このオブジェクトの型は、このインターフェースの canWrite メソッドに事前に渡されている必要があります。このメソッドは true を返している必要があります。contentType - 書き込み時に使用するコンテンツ型。コンバーターのデフォルトのコンテンツ型を使用する必要があることを示す null の場合があります。null でない場合、このメディア型は、このインターフェースの canWrite メソッドに事前に渡されている必要があり、true が返されている必要があります。outputMessage - 書き込むメッセージ IOExceptionSE - I/O エラーの場合 HttpMessageNotWritableException - 変換エラーの場合 protected MediaType getFormContentType(@Nullable MediaType contentType)
contentType が null の場合、application/x-www-form-urlencoded; charset=UTF-8 が返されます。サブクラスはこのメソッドをオーバーライドして、この動作を変更できます。
contentType - 優先コンテンツ型 (null にすることができます)protected StringSE serializeForm(MultiValueMap<StringSE,ObjectSE> formData, CharsetSE charset)
protected byte[] generateMultipartBoundary()
この実装は MimeTypeUtils.generateMultipartBoundary() に委譲します。
protected HttpEntity<?> getHttpEntity(ObjectSE part)
HttpEntity を返します。part - HttpEntity を返す部分 HttpEntity、またはそのパーツ用に新しく構築された HttpEntity ラッパー @Nullable protected StringSE getFilename(ObjectSE part)
Content-Disposition ヘッダーに使用されます。 デフォルトの実装は、パーツが Resource の場合は Resource.getFilename() を返し、それ以外の場合は null を返します。サブクラスでオーバーライドできます。
part - ファイル名を決定する部分 null