使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式
RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件
問(wèn)題描述
第三方寫(xiě)了一個(gè)文件上傳的接口,該接口的請(qǐng)求方式為Post請(qǐng)求,請(qǐng)求參數(shù)全部是以form-data表單形式進(jìn)行提交,包含三個(gè)參數(shù)
- 第一個(gè):cookie(字符串類型)
- 第二個(gè):seqNo(字符串類型)
- 第三個(gè):file(文件類型)
解決方法
使用傳統(tǒng)的Spring Cloud的Feign組件在調(diào)用遠(yuǎn)程接口實(shí)現(xiàn)文件上傳時(shí)有時(shí)會(huì)出現(xiàn)異常錯(cuò)誤,可考慮使用下述兩種方式文件上傳
第一種方式
使用RestTemplate進(jìn)行調(diào)用
import org.springframework.core.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;
}
/**
* 覆寫(xiě)父類方法
* 如果不重寫(xiě)這個(gè)方法,并且文件有一定大小,那么服務(wù)端會(huì)出現(xiàn)異常
* {@code The multi-part request contained parameter data (excluding uploaded files) that exceeded}
*/
@Override
public String getFilename() {
return fileName;
}
/**
* 覆寫(xiě)父類 contentLength 方法
* 因?yàn)?{@link org.springframework.core.io.AbstractResource#contentLength()}方法會(huì)重新讀取一遍文件,
* 而上傳文件時(shí),restTemplate 會(huì)通過(guò)這個(gè)方法獲取大小。然后當(dāng)真正需要讀取內(nèi)容的時(shí)候,發(fā)現(xiàn)已經(jīng)讀完,會(huì)報(bào)如下錯(cuò)誤。
*/
@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);
//請(qǐng)求頭設(shè)置為MediaType.MULTIPART_FORM_DATA類型
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
//構(gòu)建請(qǐng)求體
MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<>();
CommonInputStreamResource commonInputStreamResource = null;
try {
commonInputStreamResource = new CommonInputStreamResource(fileInputStream,file.length(),file.getName());
} catch (Exception e) {
log.error("文件輸入流轉(zhuǎn)換錯(cuò)誤",e);
}
requestBody.add("cookie", cookie);
requestBody.add("seqNoFile", applySeqNo);
requestBody.add("file",commonInputStreamResource);
HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(requestBody, requestHeaders);
//直接調(diào)用遠(yuǎn)程接口
ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://xxx.xxx.xxx.xxx:8080/test/upload",requestEntity, String.class);
System.out.println("返回結(jié)果:"+responseEntity.getBody())
}catch (Exception e){
log.error("遠(yuǎn)程調(diào)用出現(xiàn)異常:", e);
}
第二種方式
Spring Cloud Feign組件 + MultiValueMap + CommonInputStreamResource
CommonInputStreamResource對(duì)象的構(gòu)造在上面已經(jīng)實(shí)現(xiàn)了這里就不再重復(fù)構(gòu)造,沿用上面的那個(gè)就行
feign接口
@Component
@FeignClient(name = "taxRecodes", url = "${spider.url}", qualifier = "TaxRecodeFeignClient",fallback = TaxRecodeFallBack.class)
public interface TaxRecodeFeignClient {
/**
* 單證申請(qǐng)-合同信息表附件上傳
*/
@PostMapping(value = "/attachFile/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String attachFileUpload(MultiValueMap<String, Object> multiValueMap);
}
請(qǐng)求部分
@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(),file.getName());
} catch (Exception e) {
log.error("文件輸入流轉(zhuǎn)換錯(cuò)誤:",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){
log.error("異常:",e);
}
}
RestTemplate調(diào)用遠(yuǎn)程接口添加請(qǐng)求頭
項(xiàng)目中我們經(jīng)常會(huì)碰到與第三方系統(tǒng)對(duì)接,通過(guò)調(diào)用第三方系統(tǒng)中的接口來(lái)集成服務(wù),為了接口的安全性都為加一些驗(yàn)證,比如:
basic、authority等,通過(guò)請(qǐng)求頭添加authrization的機(jī)制比較容易接入,從第三方系統(tǒng)獲取到authorization,然后請(qǐng)求接口時(shí)在請(qǐng)求頭上帶上獲取到的authorization,說(shuō)了怎么多不如直接上代碼更容易理解。
// 獲取第三方的authorization String auth= OAuthContentHelper.getAuthorizationHeader(); HttpHeaders requestHeader=new HttpHeaders(); // 將獲取到的authorization添加到請(qǐng)求頭 requestHeader.add(AuthConstants.AUTHORIZATION_HEADER,auth); // 構(gòu)建請(qǐng)求實(shí)體 HttpEntity<Object> requestEntity=new HttpEntity(requestParam,requestHeaders); // 使用restTemplate調(diào)用第三方接口 restTemplate.exchage(url,HttpMethod.POST,requestEntity,responseClass);
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
自定義JmsListenerContainerFactory時(shí),containerFactory字段解讀
這篇文章主要介紹了自定義JmsListenerContainerFactory時(shí),containerFactory字段解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
springboot 啟動(dòng)如何修改application.properties的參數(shù)
這篇文章主要介紹了springboot 啟動(dòng)如何修改application.properties的參數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
SpringBoot中的Profile多環(huán)境配置方法
這篇文章主要介紹了SpringBoot中的Profile多環(huán)境配置,SpringBoot提供了兩種多環(huán)境配置的方式,分別是使用profile文件進(jìn)行多環(huán)境配置以及使用@Profile注解進(jìn)行多環(huán)境配置,需要的朋友可以參考下2023-01-01
一次java異步任務(wù)的實(shí)戰(zhàn)記錄
最近做項(xiàng)目的時(shí)候遇到了一個(gè)小問(wèn)題,從前臺(tái)提交到服務(wù)端A,A調(diào)用服務(wù)端B處理超時(shí),下面這篇文章主要給大家介紹了一次java異步任務(wù)的實(shí)戰(zhàn)記錄,需要的朋友可以參考下2022-05-05
基于SpringMVC攔截器實(shí)現(xiàn)接口耗時(shí)監(jiān)控功能
本文呢主要介紹了基于SpringMVC攔截器實(shí)現(xiàn)的接口耗時(shí)監(jiān)控功能,統(tǒng)計(jì)接口的耗時(shí)情況屬于一個(gè)可以復(fù)用的功能點(diǎn),因此這里直接使用 SpringMVC的HandlerInterceptor攔截器來(lái)實(shí)現(xiàn),需要的朋友可以參考下2024-02-02
Java網(wǎng)絡(luò)編程之基于TCP協(xié)議
本文主要將Java基于TCP的網(wǎng)絡(luò)編程主要分解成5個(gè)功能:功能分解1:單向通信功能分解,2:雙向通信功能分解,3:對(duì)象流傳送功能分解,4:加入完整的處理異常方式功能分解,5:多線程接收用戶請(qǐng)求,需要的朋友可以參考下2021-05-05
Java中Spring MVC接收表單數(shù)據(jù)的常用方法
Spring MVC是Spring框架中的一個(gè)模塊,用于開(kāi)發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級(jí)的、靈活的方式來(lái)構(gòu)建Web應(yīng)用,同時(shí)提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下2024-05-05

