SpringBoot中发送post文件上传请求
SpringBoot中提供了请求处理的类——Restemple类
该类发送post请求主要分为以下几个步骤:
-
建立restemple对象
-
如有需求,设置请求头,通过
HttpHeaders
类进行设置 -
设置请求体,通过
LinkedMultiValueMap
类,该类和HttpHeaders
类一致,都是实现了MultiValueMap<k,v>
接口,都是一键多值的结构(即若存入相同键的键值对,会转化为该键对应若干值的列表) -
如果同时设置请求头和请求体,需要对请求进行装配
HttpEntity<MultiValueMap<String,Object>>
若果没有设置请求头,则不需要装配请求,下一步直接发送请求体容器
LinkedMultiValueMap
类即可 -
发送请求,通过restemple对象的postForObject()可以发送post请求,并返回响应体,将其反序列化为对应的类型,若想要返回响应头和响应体的话,需要使用postForEntity()发送post请求
/**
*
* @param url
* @param data 请求体
* @param headers 请求头配置
* @param filePropertyName 文件的键名
* @param fileName 文件在表单提交的原名
* @param fileContentType 请求头文件类型
* @param fileData 文件二进制数组数据
* @param clazz 泛型的class
* @param <T>
* @return
*/
private static <T> T postFormData(
String url,
LinkedHashMap<String,String> data,
LinkedHashMap<String,String> headers,
String filePropertyName,
String fileName,
String fileContentType,
byte[] fileData,
Class<T> clazz
){
RestTemplate restTemplate = new RestTemplate();
//请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.parseMediaType(fileContentType));
//请求体容器,MultiValueMap是存储一键多值的结构
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
if(headers != null) {
httpHeaders.addAll(new LinkedMultiValueMap(headers));
}
//如果有填好的请求体,直接放入请求体容器中
if(data != null && data.size() != 0){
formData.addAll(new LinkedMultiValueMap(data));
}
if(fileData != null && fileData.length > 0){
ByteArrayResource byteArrayResource = new ByteArrayResource(fileData){
@Override
public String getFilename() {
return fileName;
}
};
formData.add(filePropertyName,byteArrayResource);
}
//HttpEntity 代表一个request请求或者响应,包含header和body
HttpEntity<MultiValueMap<String,Object>> files = new HttpEntity<>(formData, httpHeaders);
return restTemplate.postForObject(url, files, clazz);
}