Class FormHttpMessageConverter
- java.lang.Object
- org.springframework.http.converter.FormHttpMessageConverter
- All Implemented Interfaces:
HttpMessageConverter<MultiValueMap<String,?>>
- Direct Known Subclasses:
AllEncompassingFormHttpMessageConverter
public class FormHttpMessageConverter extends Object implements HttpMessageConverter<MultiValueMap<String,?>>
Implementation ofHttpMessageConverterto read and write 'normal' HTML forms and also to write (but not read) multipart data (e.g. file uploads).In other words, this converter can read and write the
"application/x-www-form-urlencoded"media type asMultiValueMap<String, String>, and it can also write (but not read) the"multipart/form-data"and"multipart/mixed"media types asMultiValueMap<String, Object>.Multipart Data
By default,
"multipart/form-data"is used as the content type when writing multipart data. As of Spring Framework 5.2 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 typeand 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
HttpMessageConvertersto write the respective MIME parts. By default, basic converters are registered for byte array,String, andResource. These can be overridden viasetPartConverters(java.util.List<org.springframework.http.converter.HttpMessageConverter<?>>)or augmented viaaddPartConverter(org.springframework.http.converter.HttpMessageConverter<?>).Examples
The following snippet shows how to submit an HTML form using the
"multipart/form-data"content type.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);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")); restTemplate.postForLocation("https://example.com/myFileUpload", parts);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")); HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(MediaType.MULTIPART_MIXED); restTemplate.postForLocation("https://example.com/myFileUpload", new HttpEntity<>(parts, requestHeaders));The following snippet shows how to do a file upload using the
"multipart/related"content type.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));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:
AllEncompassingFormHttpMessageConverter,MultiValueMap
Field Summary
Fields Modifier and Type Field Description static CharsetDEFAULT_CHARSETThe default charset used by the converter.
Constructor Summary
Constructors Constructor Description FormHttpMessageConverter()
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddPartConverter(HttpMessageConverter<?> partConverter)Add a message body converter.voidaddSupportedMediaTypes(MediaType... supportedMediaTypes)AddMediaTypeobjects to be supported by this converter.booleancanRead(Class<?> clazz, MediaType mediaType)Indicates whether the given class can be read by this converter.booleancanWrite(Class<?> clazz, MediaType mediaType)Indicates whether the given class can be written by this converter.protected byte[]generateMultipartBoundary()Generate a multipart boundary.protected StringgetFilename(Object part)Return the filename of the given multipart part.protected MediaTypegetFormContentType(MediaType contentType)Return the content type used to write forms, given the preferred content type.protected HttpEntity<?>getHttpEntity(Object part)Return anHttpEntityfor the given part Object.List<MediaType>getSupportedMediaTypes()Return the list ofMediaTypeobjects supported by this converter.MultiValueMap<String,String>read(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(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, MediaType contentType, HttpOutputMessage outputMessage)Write an given object to the given output message.
Field Detail
DEFAULT_CHARSET
public static final Charset DEFAULT_CHARSET
The default charset used by the converter.
Constructor Detail
FormHttpMessageConverter
public FormHttpMessageConverter()
Method Detail
setSupportedMediaTypes
public void setSupportedMediaTypes(List<MediaType> supportedMediaTypes)
Set the list ofMediaTypeobjects supported by this converter.
addSupportedMediaTypes
public void addSupportedMediaTypes(MediaType... supportedMediaTypes)
AddMediaTypeobjects 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 ofMediaTypeobjects to add- Since:
- 5.2
- See Also:
setSupportedMediaTypes(List)
getSupportedMediaTypes
public List<MediaType> getSupportedMediaTypes()
Return the list ofMediaTypeobjects supported by this converter.- Specified by:
getSupportedMediaTypesin interfaceHttpMessageConverter<MultiValueMap<String,?>>- Returns:
- the list of supported media types, potentially an immutable copy
- See Also:
setSupportedMediaTypes(List),addSupportedMediaTypes(MediaType...)
setPartConverters
public void setPartConverters(List<HttpMessageConverter<?>> partConverters)
Set the message body converters to use. These converters are used to convert objects to MIME parts.
addPartConverter
public void addPartConverter(HttpMessageConverter<?> partConverter)
Add a message body converter. Such a converter is used to convert objects to MIME parts.
setCharset
public void setCharset(@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.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".
setMultipartCharset
public void setMultipartCharset(Charset charset)
Set 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 onMimeUtilityfromjavax.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:
- Encoded-Word
canRead
public boolean canRead(Class<?> clazz, @Nullable MediaType mediaType)
Description copied from interface:HttpMessageConverterIndicates whether the given class can be read by this converter.- Specified by:
canReadin interfaceHttpMessageConverter<MultiValueMap<String,?>>- Parameters:
clazz- the class to test for readabilitymediaType- the media type to read (can benullif not specified); typically the value of aContent-Typeheader.- Returns:
trueif readable;falseotherwise
canWrite
public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType)
Description copied from interface:HttpMessageConverterIndicates whether the given class can be written by this converter.- Specified by:
canWritein interfaceHttpMessageConverter<MultiValueMap<String,?>>- Parameters:
clazz- the class to test for writabilitymediaType- the media type to write (can benullif not specified); typically the value of anAcceptheader.- Returns:
trueif writable;falseotherwise
read
public MultiValueMap<String,String> read(@Nullable Class<? extends MultiValueMap<String,?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException
Description copied from interface:HttpMessageConverterRead an object of the given type from the given input message, and returns it.- Specified by:
readin interfaceHttpMessageConverter<MultiValueMap<String,?>>- Parameters:
clazz- the type of object to return. This type must have previously been passed to thecanReadmethod of this interface, which must have returnedtrue.inputMessage- the HTTP input message to read from- Returns:
- the converted object
- Throws:
IOException- in case of I/O errorsHttpMessageNotReadableException- in case of conversion errors
write
public void write(MultiValueMap<String,?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException
Description copied from interface:HttpMessageConverterWrite an given object to the given output message.- Specified by:
writein interfaceHttpMessageConverter<MultiValueMap<String,?>>- Parameters:
map- the object to write to the output message. The type of this object must have previously been passed to thecanWritemethod of this interface, which must have returnedtrue.contentType- the content type to use when writing. May benullto indicate that the default content type of the converter must be used. If notnull, this media type must have previously been passed to thecanWritemethod of this interface, which must have returnedtrue.outputMessage- the message to write to- Throws:
IOException- in case of I/O errorsHttpMessageNotWritableException- in case of conversion errors
getFormContentType
protected MediaType getFormContentType(@Nullable MediaType contentType)
Return the content type used to write forms, given the preferred content type. By default, this method returns the given content type, but adds the charset if it does not have one. IfcontentTypeisnull,application/x-www-form-urlencoded; charset=UTF-8is returned.Subclasses can override this method to change this behavior.
- Parameters:
contentType- the preferred content type (can benull)- Returns:
- the content type to be used
- Since:
- 5.2.2
serializeForm
protected String serializeForm(MultiValueMap<String,Object> formData, Charset charset)
generateMultipartBoundary
protected byte[] generateMultipartBoundary()
Generate a multipart boundary.This implementation delegates to
MimeTypeUtils.generateMultipartBoundary().
getHttpEntity
protected HttpEntity<?> getHttpEntity(Object part)
Return anHttpEntityfor the given part Object.- Parameters:
part- the part to return anHttpEntityfor- Returns:
- the part Object itself it is an
HttpEntity, or a newly builtHttpEntitywrapper for that part
getFilename
@Nullable protected String getFilename(Object part)
Return 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