您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何使用RestTemplate調(diào)用遠(yuǎn)程接口上傳文件,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
第三方寫(xiě)了一個(gè)文件上傳的接口,該接口的請(qǐng)求方式為Post請(qǐng)求,請(qǐng)求參數(shù)全部是以form-data表單形式進(jìn)行提交,包含三個(gè)參數(shù)
第一個(gè):cookie(字符串類(lèi)型)
第二個(gè):seqNo(字符串類(lèi)型)
第三個(gè):file(文件類(lèi)型)
使用傳統(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ě)父類(lèi)方法 * 如果不重寫(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ě)父類(lèi) contentLength 方法 * 因?yàn)?nbsp;{@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類(lèi)型 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); } }
項(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);
看完上述內(nèi)容,你們對(duì)如何使用RestTemplate調(diào)用遠(yuǎn)程接口上傳文件有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。