最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式

 更新時間:2021年09月25日 16:04:28   作者:y_bccl27  
這篇文章主要介紹了使用RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

RestTemplate 調(diào)用遠(yuǎn)程接口上傳文件

問題描述

第三方寫了一個文件上傳的接口,該接口的請求方式為Post請求,請求參數(shù)全部是以form-data表單形式進行提交,包含三個參數(shù)

  • 第一個:cookie(字符串類型)
  • 第二個:seqNo(字符串類型)
  • 第三個:file(文件類型)

解決方法

使用傳統(tǒng)的Spring Cloud的Feign組件在調(diào)用遠(yuǎn)程接口實現(xiàn)文件上傳時有時會出現(xiàn)異常錯誤,可考慮使用下述兩種方式文件上傳

第一種方式

使用RestTemplate進行調(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;
    }
 
    /**
     * 覆寫父類方法
     * 如果不重寫這個方法,并且文件有一定大小,那么服務(wù)端會出現(xiàn)異常
     * {@code The multi-part request contained parameter data (excluding uploaded files) that exceeded}
     */
    @Override
    public String getFilename() {
        return fileName;
    }
 
    /**
     * 覆寫父類 contentLength 方法
     * 因為 {@link org.springframework.core.io.AbstractResource#contentLength()}方法會重新讀取一遍文件,
     * 而上傳文件時,restTemplate 會通過這個方法獲取大小。然后當(dāng)真正需要讀取內(nèi)容的時候,發(fā)現(xiàn)已經(jīng)讀完,會報如下錯誤。
     */
    @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);
 
    //請求頭設(shè)置為MediaType.MULTIPART_FORM_DATA類型
    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
    
    //構(gòu)建請求體
    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)換錯誤",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對象的構(gòu)造在上面已經(jīng)實現(xiàn)了這里就不再重復(fù)構(gòu)造,沿用上面的那個就行

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(),file.getName());
        } catch (Exception e) {
            log.error("文件輸入流轉(zhuǎn)換錯誤:",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)程接口添加請求頭

項目中我們經(jīng)常會碰到與第三方系統(tǒng)對接,通過調(diào)用第三方系統(tǒng)中的接口來集成服務(wù),為了接口的安全性都為加一些驗證,比如:

basic、authority等,通過請求頭添加authrization的機制比較容易接入,從第三方系統(tǒng)獲取到authorization,然后請求接口時在請求頭上帶上獲取到的authorization,說了怎么多不如直接上代碼更容易理解。

// 獲取第三方的authorization
String auth= OAuthContentHelper.getAuthorizationHeader();
HttpHeaders requestHeader=new HttpHeaders();
// 將獲取到的authorization添加到請求頭
requestHeader.add(AuthConstants.AUTHORIZATION_HEADER,auth);
// 構(gòu)建請求實體
HttpEntity<Object> requestEntity=new HttpEntity(requestParam,requestHeaders);
// 使用restTemplate調(diào)用第三方接口
restTemplate.exchage(url,HttpMethod.POST,requestEntity,responseClass);

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot靜態(tài)資源及原理解析

    SpringBoot靜態(tài)資源及原理解析

    這篇文章主要介紹了SpringBoot靜態(tài)資源及原理解析,當(dāng)創(chuàng)建一個jar工程時,想引入css等靜態(tài)資源時,需要遵守SpringBoot的靜態(tài)資源映射關(guān)系,通過WebMvcAutoConfiguration查看靜態(tài)配置資源的規(guī)則,需要的朋友可以參考下
    2023-12-12
  • Java中抽象類的作用及說明

    Java中抽象類的作用及說明

    這篇文章主要介紹了Java中抽象類的作用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 自定義JmsListenerContainerFactory時,containerFactory字段解讀

    自定義JmsListenerContainerFactory時,containerFactory字段解讀

    這篇文章主要介紹了自定義JmsListenerContainerFactory時,containerFactory字段解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • springboot 啟動如何修改application.properties的參數(shù)

    springboot 啟動如何修改application.properties的參數(shù)

    這篇文章主要介紹了springboot 啟動如何修改application.properties的參數(shù)方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot中的Profile多環(huán)境配置方法

    SpringBoot中的Profile多環(huán)境配置方法

    這篇文章主要介紹了SpringBoot中的Profile多環(huán)境配置,SpringBoot提供了兩種多環(huán)境配置的方式,分別是使用profile文件進行多環(huán)境配置以及使用@Profile注解進行多環(huán)境配置,需要的朋友可以參考下
    2023-01-01
  • 一次java異步任務(wù)的實戰(zhàn)記錄

    一次java異步任務(wù)的實戰(zhàn)記錄

    最近做項目的時候遇到了一個小問題,從前臺提交到服務(wù)端A,A調(diào)用服務(wù)端B處理超時,下面這篇文章主要給大家介紹了一次java異步任務(wù)的實戰(zhàn)記錄,需要的朋友可以參考下
    2022-05-05
  • 基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能

    基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能

    本文呢主要介紹了基于SpringMVC攔截器實現(xiàn)的接口耗時監(jiān)控功能,統(tǒng)計接口的耗時情況屬于一個可以復(fù)用的功能點,因此這里直接使用 SpringMVC的HandlerInterceptor攔截器來實現(xiàn),需要的朋友可以參考下
    2024-02-02
  • Java網(wǎng)絡(luò)編程之基于TCP協(xié)議

    Java網(wǎng)絡(luò)編程之基于TCP協(xié)議

    本文主要將Java基于TCP的網(wǎng)絡(luò)編程主要分解成5個功能:功能分解1:單向通信功能分解,2:雙向通信功能分解,3:對象流傳送功能分解,4:加入完整的處理異常方式功能分解,5:多線程接收用戶請求,需要的朋友可以參考下
    2021-05-05
  • Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Java中Spring MVC接收表單數(shù)據(jù)的常用方法

    Spring MVC是Spring框架中的一個模塊,用于開發(fā)基于MVC(Model-View-Controller)架構(gòu)的Web應(yīng)用程序,它提供了一種輕量級的、靈活的方式來構(gòu)建Web應(yīng)用,同時提供了豐富的功能和特性,本文給大家介紹了Spring MVC接收表單數(shù)據(jù)的方法,需要的朋友可以參考下
    2024-05-05
  • Java設(shè)計模式中的組合模式

    Java設(shè)計模式中的組合模式

    這篇文章主要介紹了Java設(shè)計模式中的組合模式,組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次,種類型的設(shè)計模式屬于結(jié)構(gòu)型模式
    2022-07-07

最新評論

伊宁县| 博兴县| 德阳市| 石家庄市| 秦安县| 包头市| 南澳县| 浏阳市| 尚义县| 石阡县| 五河县| 余庆县| 济宁市| 亳州市| 灯塔市| 会同县| 福海县| 天长市| 思南县| 丽江市| 包头市| 东乌珠穆沁旗| 绥化市| 广州市| 县级市| 沿河| 洛阳市| 罗山县| 新闻| 定安县| 锦屏县| 甘肃省| 峡江县| 大悟县| 芦溪县| 郑州市| 崇仁县| 岢岚县| 新绛县| 涿州市| 新民市|