Class FormHttpMessageConverter
- All Implemented Interfaces:
- HttpMessageConverter<MultiValueMap<String,- ?>> 
- Direct Known Subclasses:
- AllEncompassingFormHttpMessageConverter
HttpMessageConverter to read and write 'normal' HTML
forms and also to write (but not read) multipart data (for example, file uploads).
In other words, this converter can read and write the
"application/x-www-form-urlencoded" media type as
MultiValueMap<String, String>, and it can also
write (but not read) the "multipart/form-data" and
"multipart/mixed" media types as
MultiValueMap<String, Object>.
Multipart Data
By default, "multipart/form-data" is used as the content type when
writing multipart data. It is also possible to write
multipart data using other multipart subtypes such as "multipart/mixed"
and "multipart/related", as long as the multipart subtype is registered
as a supported media type and the
desired multipart subtype is specified as the content type when
writing the multipart data. Note that "multipart/mixed"
is registered as a supported media type by default.
When writing multipart data, this converter uses other
HttpMessageConverters to write the respective
MIME parts. By default, basic converters are registered for byte array,
String, and Resource. These can be overridden via
setPartConverters(List) or augmented via addPartConverter(HttpMessageConverter).
Examples
The following snippet shows how to submit an HTML form using the
"multipart/form-data" content type.
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();
The following snippet shows how to do a file upload using the
"multipart/form-data" content type.
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();
The following snippet shows how to do a file upload using the
"multipart/mixed" content type.
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();
The following snippet shows how to do a file upload using the
"multipart/related" content type.
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();
Miscellaneous
Some methods in this class were inspired by
org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity.
- Since:
- 3.0
- Author:
- Arjen Poutsma, Rossen Stoyanchev, Juergen Hoeller, Sam Brannen
- See Also:
- 
Field SummaryFields
- 
Constructor SummaryConstructors
- 
Method SummaryModifier and TypeMethodDescriptionvoidaddPartConverter(HttpMessageConverter<?> partConverter) Add a message body converter.voidaddSupportedMediaTypes(MediaType... supportedMediaTypes) AddMediaTypeobjects to be supported by this converter.booleanIndicates whether the given class can be read by this converter.booleanIndicates whether the given class can be written by this converter.protected byte[]Generate a multipart boundary.getFilename(Object part) Return the filename of the given multipart part.protected MediaTypegetFormContentType(@Nullable MediaType contentType) Return the content type used to write forms, either the given content type or otherwiseapplication/x-www-form-urlencoded.protected HttpEntity<?> getHttpEntity(Object part) Return anHttpEntityfor the given part Object.Return the configured converters for MIME parts.Return the list of media types supported by this converter.read(@Nullable Class<? extends MultiValueMap<String, ?>> clazz, HttpInputMessage inputMessage) Read an object of the given type from the given input message, and returns it.protected StringserializeForm(MultiValueMap<String, Object> formData, Charset charset) voidsetCharset(@Nullable Charset charset) Set the default character set to use for reading and writing form data when the request or responseContent-Typeheader does not explicitly specify it.voidsetMultipartCharset(Charset charset) Set the character set to use when writing multipart data to encode file names.voidsetPartConverters(List<HttpMessageConverter<?>> partConverters) Set the message body converters to use.voidsetSupportedMediaTypes(List<MediaType> supportedMediaTypes) Set the list ofMediaTypeobjects supported by this converter.voidwrite(MultiValueMap<String, ?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) Write a given object to the given output message.Methods inherited from class Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface HttpMessageConvertergetSupportedMediaTypes
- 
Field Details- 
DEFAULT_CHARSETThe default charset used by the converter.
 
- 
- 
Constructor Details- 
FormHttpMessageConverterpublic FormHttpMessageConverter()
 
- 
- 
Method Details- 
setSupportedMediaTypes
- 
addSupportedMediaTypesAddMediaTypeobjects to be supported by this converter.The supplied MediaTypeobjects will be appended to the list of supported MediaType objects.- Parameters:
- supportedMediaTypes- a var-args list of- MediaTypeobjects to add
- Since:
- 5.2
- See Also:
 
- 
getSupportedMediaTypesReturn the list of media types supported by this converter. The list may not apply to every possible target element type and calls to this method should typically be guarded viacanWrite(clazz, null. The list may also exclude MIME types supported only for a specific class. Alternatively, useHttpMessageConverter.getSupportedMediaTypes(Class)for a more precise list.- Specified by:
- getSupportedMediaTypesin interface- HttpMessageConverter<MultiValueMap<String,- ?>> 
- Returns:
- the list of supported media types
- See Also:
 
- 
setPartConvertersSet the message body converters to use. These converters are used to convert objects to MIME parts.
- 
getPartConvertersReturn the configured converters for MIME parts.- Since:
- 5.3
 
- 
addPartConverterAdd a message body converter. Such a converter is used to convert objects to MIME parts.
- 
setCharsetSet the default character set to use for reading and writing form data when the request or responseContent-Typeheader does not explicitly specify it.As of 4.3, this is also used as the default charset for the conversion of text bodies in a multipart request. As of 5.0, this is also used for part headers including Content-Disposition(and its filename parameter) unless (the mutually exclusive)multipartCharsetis also set, in which case part headers are encoded as ASCII and filename is encoded with theencoded-wordsyntax from RFC 2047.By default this is set to "UTF-8". 
- 
setMultipartCharsetSet the character set to use when writing multipart data to encode file names. Encoding is based on theencoded-wordsyntax defined in RFC 2047 and relies onMimeUtilityfromjakarta.mail.As of 5.0 by default part headers, including Content-Disposition(and its filename parameter) will be encoded based on the setting ofsetCharset(Charset)orUTF-8by default.- Since:
- 4.1.1
- See Also:
 
- 
canReadDescription copied from interface:HttpMessageConverterIndicates whether the given class can be read by this converter.- Specified by:
- canReadin interface- HttpMessageConverter<MultiValueMap<String,- ?>> 
- Parameters:
- clazz- the class to test for readability
- mediaType- the media type to read (can be- nullif not specified); typically the value of a- Content-Typeheader.
- Returns:
- trueif readable;- falseotherwise
 
- 
canWriteDescription copied from interface:HttpMessageConverterIndicates whether the given class can be written by this converter.- Specified by:
- canWritein interface- HttpMessageConverter<MultiValueMap<String,- ?>> 
- Parameters:
- clazz- the class to test for writability
- mediaType- the media type to write (can be- nullif not specified); typically the value of an- Acceptheader.
- Returns:
- trueif writable;- falseotherwise
 
- 
readpublic MultiValueMap<String,String> read(@Nullable Class<? extends MultiValueMap<String, ?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableExceptionDescription copied from interface:HttpMessageConverterRead an object of the given type from the given input message, and returns it.- Specified by:
- readin interface- HttpMessageConverter<MultiValueMap<String,- ?>> 
- Parameters:
- clazz- the type of object to return. This type must have previously been passed to the- canReadmethod of this interface, which must have returned- true.
- inputMessage- the HTTP input message to read from
- Returns:
- the converted object
- Throws:
- IOException- in case of I/O errors
- HttpMessageNotReadableException- in case of conversion errors
 
- 
writepublic void write(MultiValueMap<String, ?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableExceptionDescription copied from interface:HttpMessageConverterWrite a given object to the given output message.- Specified by:
- writein interface- HttpMessageConverter<MultiValueMap<String,- ?>> 
- Parameters:
- map- the object to write to the output message. The type of this object must have previously been passed to the- canWritemethod of this interface, which must have returned- true.
- contentType- the content type to use when writing. May be- nullto indicate that the default content type of the converter must be used. If not- null, this media type must have previously been passed to the- canWritemethod of this interface, which must have returned- true.
- outputMessage- the message to write to
- Throws:
- IOException- in case of I/O errors
- HttpMessageNotWritableException- in case of conversion errors
 
- 
getFormContentTypeReturn the content type used to write forms, either the given content type or otherwiseapplication/x-www-form-urlencoded.- Parameters:
- contentType- the content type passed to- write(MultiValueMap, MediaType, HttpOutputMessage), or- null
- Returns:
- the content type to use
- Since:
- 5.2.2
 
- 
serializeForm
- 
generateMultipartBoundaryprotected byte[] generateMultipartBoundary()Generate a multipart boundary.This implementation delegates to MimeTypeUtils.generateMultipartBoundary().
- 
getHttpEntityReturn anHttpEntityfor the given part Object.- Parameters:
- part- the part to return an- HttpEntityfor
- Returns:
- the part Object itself it is an HttpEntity, or a newly builtHttpEntitywrapper for that part
 
- 
getFilenameReturn the filename of the given multipart part. This value will be used for theContent-Dispositionheader.The default implementation returns Resource.getFilename()if the part is aResource, andnullin other cases. Can be overridden in subclasses.- Parameters:
- part- the part to determine the file name for
- Returns:
- the filename, or nullif not known
 
 
-