使⽤RestTemplate调⽤远程接⼝上传⽂件⽅式
⽬录
RestTemplate 调⽤远程接⼝上传⽂件
问题描述
解决⽅法
第⼀种⽅式
第⼆种⽅式
RestTemplate调⽤远程接⼝添加请求头
RestTemplate 调⽤远程接⼝上传⽂件
问题描述
第三⽅写了⼀个⽂件上传的接⼝,该接⼝的请求⽅式为Post请求,请求参数全部是以form-data表单形式进⾏提交,包含三个参数
第⼀个:cookie(字符串类型)
第⼆个:seqNo(字符串类型)
第三个:file(⽂件类型)
解决⽅法
使⽤传统的Spring Cloud的Feign组件在调⽤远程接⼝实现⽂件上传时有时会出现异常错误,可考虑使⽤下述两种⽅式⽂件上传
第⼀种⽅式
使⽤RestTemplate进⾏调⽤
import io.InputStreamResource;
import java.io.InputStream;
public class CommonInputStreamResource extends InputStreamResource {
private long length;
private String fileName;
public CommonInputStreamResource(InputStream inputStream, long length, String fileName) {
super(inputStream);
this.length = length;
this.fileName = fileName;
}
/**
* 覆写⽗类⽅法
* 如果不重写这个⽅法,并且⽂件有⼀定⼤⼩,那么服务端会出现异常
* {@code The multi-part request contained parameter data (excluding uploaded files) that exceeded}
*/
@Override
public String getFilename() {
return fileName;
}
/**
* 覆写⽗类 contentLength ⽅法
* 因为 {@link io.AbstractResource#contentLength()}⽅法会重新读取⼀遍⽂件,
* ⽽上传⽂件时,restTemplate 会通过这个⽅法获取⼤⼩。然后当真正需要读取内容的时候,发现已经读完,会报如下错误。
*/
@Override
public long contentLength() {
long estimate = length;
return estimate == 0 ? 1 : estimate;
}
public void setLength(long length) {
this.length = length;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
try{
String applySeqNo = "123456";
String cookie="654321";
File file=new File("E:\\1.rar");
FileInputStream fileInputStream=new FileInputStream(file);
//请求头设置为MediaType.MULTIPART_FORM_DATA类型
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
//构建请求体
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();spring framework组件
CommonInputStreamResource commonInputStreamResource = null;
try {
commonInputStreamResource = new CommonInputStreamResource(fileInputStream,file.length(),Name());
} catch (Exception e) {
<("⽂件输⼊流转换错误",e);
}
requestBody.add("cookie", cookie);
requestBody.add("seqNoFile", applySeqNo);
requestBody.add("file",commonInputStreamResource);
HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(requestBody, requestHeaders);
//直接调⽤远程接⼝
ResponseEntity<String> responseEntity = restTemplate.postForEntity("x:8080/test/upload",requestEntity, String.class);    System.out.println("返回结果:"+Body())
}catch (Exception e){
<("远程调⽤出现异常:", e);
}
第⼆种⽅式
Spring Cloud Feign组件 + MultiValueMap + CommonInputStreamResource CommonInputStreamResource对象的构造在上⾯已经实现了这⾥就不再重复构造,沿⽤上⾯的那个就⾏
feign接⼝
@Component
@FeignClient(name = "taxRecodes", url = "${spider.url}", qualifier = "TaxRecodeFeignClient",fallback = TaxRecodeFallBack.class)
public interface TaxRecodeFeignClient {
/**
* 单证申请-合同信息表附件上传
*/
@PostMapping(value = "/attachFile/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String attachFileUpload(MultiValueMap<String, Object> multiValueMap);
}
请求部分
@PostMapping("/upload")
public void upload(){
try {
File file=new File("E:\\1.rar");
FileInputStream fileInputStream=new FileInputStream(file);
CommonInputStreamResource commonInputStreamResource = null;
try {
commonInputStreamResource = new CommonInputStreamResource(fileInputStream,fileInputStream.available(),Name());
} catch (Exception e) {
<("⽂件输⼊流转换错误:",e);
}
MultiValueMap<String, Object> dto=new LinkedMultiValueMap<String, Object>();
dto.add("cookie","xxx");
dto.add("file",commonInputStreamResource);
dto.add("seqNoFile","xxx");
String returnInfo = taxRecodeFeignClient.attachFileUpload(dto);
JSONObject returnInfoJsonObject = JSONObject.parseObject(returnInfo);
}catch (Exception e){
<("异常:",e);
}
}
RestTemplate调⽤远程接⼝添加请求头
项⽬中我们经常会碰到与第三⽅系统对接,通过调⽤第三⽅系统中的接⼝来集成服务,为了接⼝的安全性都为加⼀些验证,⽐如:
basic、authority等,通过请求头添加authrization的机制⽐较容易接⼊,从第三⽅系统获取到authorization,然后请求接⼝时在请求头上带上获取到的authorization,说了怎么多不如直接上代码更容易理解。
// 获取第三⽅的authorization
String auth= AuthorizationHeader();
HttpHeaders requestHeader=new HttpHeaders();
// 将获取到的authorization添加到请求头
requestHeader.add(AuthConstants.AUTHORIZATION_HEADER,auth);
// 构建请求实体
HttpEntity<Object> requestEntity=new HttpEntity(requestParam,requestHeaders);
// 使⽤restTemplate调⽤第三⽅接⼝
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。