Class FormHttpMessageConverter
- java.lang.Object
- org.springframework.http.converter.FormHttpMessageConverter
- All Implemented Interfaces:
HttpMessageConverter<MultiValueMap<String,?>>
- Direct Known Subclasses:
AllEncompassingFormHttpMessageConverter
,XmlAwareFormHttpMessageConverter
public class FormHttpMessageConverter extends Object implements HttpMessageConverter<MultiValueMap<String,?>>
Implementation ofHttpMessageConverter
to 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"
media type asMultiValueMap<String, Object>
.When writing multipart data, this converter uses other
HttpMessageConverters
to write the respective MIME parts. By default, basic converters are registered (forStrings
andResources
). These can be overridden through thepartConverters
property.For example, the following snippet shows how to submit an HTML form:
RestTemplate template = new RestTemplate(); // AllEncompassingFormHttpMessageConverter is configured by default MultiValueMap<String, String> form = new LinkedMultiValueMap<>(); form.add("field 1", "value 1"); form.add("field 2", "value 2"); form.add("field 2", "value 3"); template.postForLocation("https://example.com/myForm", form);
The following snippet shows how to do a file upload:
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>(); parts.add("field 1", "value 1"); parts.add("file", new ClassPathResource("myFile.jpg")); template.postForLocation("https://example.com/myFileUpload", parts);
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
- See Also:
AllEncompassingFormHttpMessageConverter
,MultiValueMap
Field Summary
Fields Modifier and Type Field Description static Charset
DEFAULT_CHARSET
Constructor Summary
Constructors Constructor Description FormHttpMessageConverter()
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addPartConverter(HttpMessageConverter<?> partConverter)
Add a message body converter.boolean
canRead(Class<?> clazz, MediaType mediaType)
Indicates whether the given class can be read by this converter.boolean
canWrite(Class<?> clazz, MediaType mediaType)
Indicates whether the given class can be written by this converter.protected byte[]
generateMultipartBoundary()
Generate a multipart boundary.protected String
getFilename(Object part)
Return the filename of the given multipart part.protected HttpEntity<?>
getHttpEntity(Object part)
Return anHttpEntity
for the given part Object.List<MediaType>
getSupportedMediaTypes()
Return the list ofMediaType
objects 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.void
setCharset(Charset charset)
Set the default character set to use for reading and writing form data when the request or response Content-Type header does not explicitly specify it.void
setMultipartCharset(Charset charset)
Set the character set to use when writing multipart data to encode file names.void
setPartConverters(List<HttpMessageConverter<?>> partConverters)
Set the message body converters to use.void
setSupportedMediaTypes(List<MediaType> supportedMediaTypes)
Set the list ofMediaType
objects supported by this converter.void
write(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
Constructor Detail
FormHttpMessageConverter
public FormHttpMessageConverter()
Method Detail
setSupportedMediaTypes
public void setSupportedMediaTypes(List<MediaType> supportedMediaTypes)
Set the list ofMediaType
objects supported by this converter.
getSupportedMediaTypes
public List<MediaType> getSupportedMediaTypes()
Description copied from interface:HttpMessageConverter
Return the list ofMediaType
objects supported by this converter.- Specified by:
getSupportedMediaTypes
in interfaceHttpMessageConverter<MultiValueMap<String,?>>
- Returns:
- the list of supported media types, potentially an immutable copy
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(Charset charset)
Set the default character set to use for reading and writing form data when the request or response Content-Type header does not explicitly specify it.By default this is set to "UTF-8". As of 4.3, it will also be used as the default charset for the conversion of text bodies in a multipart request. In contrast to this,
setMultipartCharset(java.nio.charset.Charset)
only affects the encoding of file names in a multipart request according to the encoded-word syntax.
setMultipartCharset
public void setMultipartCharset(Charset charset)
Set the character set to use when writing multipart data to encode file names. Encoding is based on the encoded-word syntax defined in RFC 2047 and relies onMimeUtility
from "javax.mail".If not set file names will be encoded as US-ASCII.
- Since:
- 4.1.1
- See Also:
- Encoded-Word
canRead
public boolean canRead(Class<?> clazz, MediaType mediaType)
Description copied from interface:HttpMessageConverter
Indicates whether the given class can be read by this converter.- Specified by:
canRead
in interfaceHttpMessageConverter<MultiValueMap<String,?>>
- Parameters:
clazz
- the class to test for readabilitymediaType
- the media type to read (can benull
if not specified); typically the value of aContent-Type
header.- Returns:
true
if readable;false
otherwise
canWrite
public boolean canWrite(Class<?> clazz, MediaType mediaType)
Description copied from interface:HttpMessageConverter
Indicates whether the given class can be written by this converter.- Specified by:
canWrite
in interfaceHttpMessageConverter<MultiValueMap<String,?>>
- Parameters:
clazz
- the class to test for writabilitymediaType
- the media type to write (can benull
if not specified); typically the value of anAccept
header.- Returns:
true
if writable;false
otherwise
read
public MultiValueMap<String,String> read(Class<? extends MultiValueMap<String,?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException
Description copied from interface:HttpMessageConverter
Read an object of the given type from the given input message, and returns it.- Specified by:
read
in interfaceHttpMessageConverter<MultiValueMap<String,?>>
- Parameters:
clazz
- the type of object to return. This type must have previously been passed to thecanRead
method 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, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException
Description copied from interface:HttpMessageConverter
Write an given object to the given output message.- Specified by:
write
in interfaceHttpMessageConverter<MultiValueMap<String,?>>
- Parameters:
map
- the object to write to the output message. The type of this object must have previously been passed to thecanWrite
method of this interface, which must have returnedtrue
.contentType
- the content type to use when writing. May benull
to indicate that the default content type of the converter must be used. If notnull
, this media type must have previously been passed to thecanWrite
method 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
generateMultipartBoundary
protected byte[] generateMultipartBoundary()
Generate a multipart boundary.This implementation delegates to
MimeTypeUtils.generateMultipartBoundary()
.
getHttpEntity
protected HttpEntity<?> getHttpEntity(Object part)
Return anHttpEntity
for the given part Object.- Parameters:
part
- the part to return anHttpEntity
for- Returns:
- the part Object itself it is an
HttpEntity
, or a newly builtHttpEntity
wrapper for that part
getFilename
protected String getFilename(Object part)
Return the filename of the given multipart part. This value will be used for theContent-Disposition
header.The default implementation returns
Resource.getFilename()
if the part is aResource
, andnull
in other cases. Can be overridden in subclasses.- Parameters:
part
- the part to determine the file name for- Returns:
- the filename, or
null
if not known