一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 使用RestTemplate 調(diào)用遠程接口上傳文件方式

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

2022-01-18 18:26y_bccl27 Java教程

這篇文章主要介紹了使用RestTemplate 調(diào)用遠程接口上傳文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

問題描述

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

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

解決方法

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

第一種方式

使用RestTemplate進行調(diào)用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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)用遠程接口
    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("遠程調(diào)用出現(xiàn)異常:", e);
}

第二種方式

Spring Cloud Feign組件 + MultiValueMap + CommonInputStreamResource

CommonInputStreamResource對象的構(gòu)造在上面已經(jīng)實現(xiàn)了這里就不再重復(fù)構(gòu)造,沿用上面的那個就行

feign接口

?
1
2
3
4
5
6
7
8
9
@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);
}

請求部分

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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)用遠程接口添加請求頭

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

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

?
1
2
3
4
5
6
7
8
9
// 獲取第三方的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)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/y_bccl27/article/details/115088532

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 国产欧美曰韩一区二区三区 | 韩国久播影院理论片不卡影院 | 我们日本在线观看免费动漫下载 | 2020年精品国产午夜福利在线 | 亚洲AV久久久噜噜噜久久 | tolove第一季动画在线看 | 亚洲精品二三区伊人久久 | 国产精品嫩草影院一二三区入口 | 青春学堂在线观看 | 91久久99热青草国产 | 按摩师他揉我奶好爽捏我奶 | 亚洲精品福利在线 | 精品卡1卡2卡三卡免费网站 | 日韩伦理在线观看 | 91久久国产成人免费观看资源 | 成3d漫二区三区四区 | 亚洲视频免费在线看 | 人妖女天堂视频在线96 | 免费在线观看小视频 | 欧美大陆日韩一区二区三区 | 国产精品亚洲w码日韩中文 国产精品香蕉在线观看不卡 | 久青草国产在线观看视频 | 国模李丽莎大尺度啪啪 | 九九在线精品亚洲国产 | 欧美日韩1区2区 | 男女污网站| 大胆国模一区二区三区伊人 | 日本狠狠操 | 亚洲激情偷拍 | 激情另类国内一区二区视频 | 黑人又大又硬又粗再深一点 | 91影视在线看免费观看 | 久久精品麻豆国产天美传媒果冻 | sao虎在线精品永久在线 | 催眠白丝舞蹈老师小说 | 搡60一70岁的老女人小说 | 日本高清在线观看天码888 | 精品人伦一区二区三区潘金莲 | 亚洲大逼 | 91东航翘臀女神在线播放 | 午夜毛片在线观看 |