类 FormHttpMessageConverter
- 所有已实现的接口:
HttpMessageConverter<cn.taketoday.util.MultiValueMap<String,?>>
HttpMessageConverter 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 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(java.util.List<cn.taketoday.http.converter.HttpMessageConverter<?>>) or augmented via addPartConverter(cn.taketoday.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 DefaultMultiValueMap<>();
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
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 DefaultMultiValueMap<>();
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 DefaultMultiValueMap<>();
parts.add("field 1", "value 1");
parts.add("file", new ClassPathResource("myFile.jpg"));
HttpHeaders requestHeaders = HttpHeaders.create();
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 DefaultMultiValueMap<>();
parts.add("field 1", "value 1");
parts.add("file", new ClassPathResource("myFile.jpg"));
HttpHeaders requestHeaders = HttpHeaders.create();
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.
- 从以下版本开始:
- 4.0
- 作者:
- Arjen Poutsma, Rossen Stoyanchev, Juergen Hoeller, Sam Brannen
- 另请参阅:
-
AllEncompassingFormHttpMessageConverterMultiValueMap
-
嵌套类概要
嵌套类修饰符和类型类说明private static classInner class to avoid a hard dependency on the JavaMail API.private static classImplementation ofHttpOutputMessageused to write a MIME multipart.private static classOutputStream that neither flushes nor closes. -
字段概要
字段 -
构造器概要
构造器 -
方法概要
修饰符和类型方法说明voidaddPartConverter(HttpMessageConverter<?> partConverter) Add a message body converter.voidaddSupportedMediaTypes(MediaType... supportedMediaTypes) AddMediaTypeobjects to be supported by this converter.private voidApply the configured charset as a default to registered part converters.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.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.Return the configured converters for MIME parts.Return the list of media types supported by this converter.private booleanWhensetMultipartCharset(Charset)is configured (i.e.private booleanisMultipart(cn.taketoday.util.MultiValueMap<String, ?> map, MediaType contentType) read(Class<? extends cn.taketoday.util.MultiValueMap<String, ?>> clazz, HttpInputMessage inputMessage) Read an object of the given type from the given input message, and returns it.protected StringserializeForm(cn.taketoday.util.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(cn.taketoday.util.MultiValueMap<String, ?> map, MediaType contentType, HttpOutputMessage outputMessage) Write an given object to the given output message.private voidwriteBoundary(OutputStream os, byte[] boundary) private static voidwriteEnd(OutputStream os, byte[] boundary) private voidwriteForm(cn.taketoday.util.MultiValueMap<String, Object> formData, MediaType contentType, HttpOutputMessage outputMessage) private voidwriteMultipart(cn.taketoday.util.MultiValueMap<String, Object> parts, MediaType contentType, HttpOutputMessage outputMessage) private static voidprivate voidwritePart(String name, HttpEntity<?> partEntity, OutputStream os) private voidwriteParts(OutputStream os, cn.taketoday.util.MultiValueMap<String, Object> parts, byte[] boundary) 从类继承的方法 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait从接口继承的方法 cn.taketoday.http.converter.HttpMessageConverter
getSupportedMediaTypes
-
字段详细资料
-
DEFAULT_CHARSET
The default charset used by the converter. -
DEFAULT_FORM_DATA_MEDIA_TYPE
-
supportedMediaTypes
-
partConverters
-
charset
-
multipartCharset
-
-
构造器详细资料
-
FormHttpMessageConverter
public FormHttpMessageConverter()
-
-
方法详细资料
-
setSupportedMediaTypes
Set the list ofMediaTypeobjects supported by this converter. -
addSupportedMediaTypes
AddMediaTypeobjects to be supported by this converter.The supplied
MediaTypeobjects will be appended to the list of supported MediaType objects.- 参数:
supportedMediaTypes- a var-args list ofMediaTypeobjects to add- 另请参阅:
-
getSupportedMediaTypes
Return 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.- 指定者:
getSupportedMediaTypes在接口中HttpMessageConverter<cn.taketoday.util.MultiValueMap<String,?>> - 返回:
- the list of supported media types
- 另请参阅:
-
setPartConverters
Set the message body converters to use. These converters are used to convert objects to MIME parts. -
getPartConverters
Return the configured converters for MIME parts. -
addPartConverter
Add a message body converter. Such a converter is used to convert objects to MIME parts. -
setCharset
Set the default character set to use for reading and writing form data when the request or responseContent-Typeheader does not explicitly specify it.this is also used as the default charset for the conversion of text bodies in a multipart request.
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".
-
applyDefaultCharset
private void applyDefaultCharset()Apply the configured charset as a default to registered part converters. -
setMultipartCharset
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.by default part headers, including
Content-Disposition(and its filename parameter) will be encoded based on the setting ofsetCharset(Charset)orUTF-8by default.- 另请参阅:
-
canRead
从接口复制的说明:HttpMessageConverterIndicates whether the given class can be read by this converter.- 指定者:
canRead在接口中HttpMessageConverter<cn.taketoday.util.MultiValueMap<String,?>> - 参数:
clazz- the class to test for readabilitymediaType- the media type to read (can benullif not specified); typically the value of aContent-Typeheader.- 返回:
trueif readable;falseotherwise
-
canWrite
从接口复制的说明:HttpMessageConverterIndicates whether the given class can be written by this converter.- 指定者:
canWrite在接口中HttpMessageConverter<cn.taketoday.util.MultiValueMap<String,?>> - 参数:
clazz- the class to test for writabilitymediaType- the media type to write (can benullif not specified); typically the value of anAcceptheader.- 返回:
trueif writable;falseotherwise
-
read
public cn.taketoday.util.MultiValueMap<String,String> read(@Nullable Class<? extends cn.taketoday.util.MultiValueMap<String, ?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException从接口复制的说明:HttpMessageConverterRead an object of the given type from the given input message, and returns it.- 指定者:
read在接口中HttpMessageConverter<cn.taketoday.util.MultiValueMap<String,?>> - 参数:
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- 返回:
- the converted object
- 抛出:
IOException- in case of I/O errorsHttpMessageNotReadableException- in case of conversion errors
-
write
public void write(cn.taketoday.util.MultiValueMap<String, ?> map, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException从接口复制的说明:HttpMessageConverterWrite an given object to the given output message.- 指定者:
write在接口中HttpMessageConverter<cn.taketoday.util.MultiValueMap<String,?>> - 参数:
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- 抛出:
IOException- in case of I/O errorsHttpMessageNotWritableException- in case of conversion errors
-
isMultipart
-
writeForm
private void writeForm(cn.taketoday.util.MultiValueMap<String, Object> formData, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException- 抛出:
IOException
-
getFormContentType
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.
- 参数:
contentType- the preferred content type (can benull)- 返回:
- the content type to be used
-
serializeForm
-
writeMultipart
private void writeMultipart(cn.taketoday.util.MultiValueMap<String, Object> parts, @Nullable MediaType contentType, HttpOutputMessage outputMessage) throws IOException- 抛出:
IOException
-
isFilenameCharsetSet
private boolean isFilenameCharsetSet()WhensetMultipartCharset(Charset)is configured (i.e. RFC 2047,encoded-wordsyntax) we need to use ASCII for part headers, or otherwise we encode directly using the configuredsetCharset(Charset). -
writeParts
private void writeParts(OutputStream os, cn.taketoday.util.MultiValueMap<String, Object> parts, byte[] boundary) throws IOException- 抛出:
IOException
-
writePart
- 抛出:
IOException
-
generateMultipartBoundary
protected byte[] generateMultipartBoundary()Generate a multipart boundary.This implementation delegates to
MimeTypeUtils.generateMultipartBoundary(). -
getHttpEntity
Return anHttpEntityfor the given part Object.- 参数:
part- the part to return anHttpEntityfor- 返回:
- the part Object itself it is an
HttpEntity, or a newly builtHttpEntitywrapper for that part
-
getFilename
Return the filename of the given multipart part. This value will be used for theContent-Dispositionheader.The default implementation returns
Resource.getName()if the part is aResource, andnullin other cases. Can be overridden in subclasses.- 参数:
part- the part to determine the file name for- 返回:
- the filename, or
nullif not known
-
writeBoundary
- 抛出:
IOException
-
writeEnd
- 抛出:
IOException
-
writeNewLine
- 抛出:
IOException
-