如何使用RestTemplate调用远程接口上传文件
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,今天就跟大家聊聊有关如何使用RestTemplate调用远程接口上传文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。RestTemplate
千家信息网最后更新 2025年01月18日如何使用RestTemplate调用远程接口上传文件
今天就跟大家聊聊有关如何使用RestTemplate调用远程接口上传文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
RestTemplate 调用远程接口上传文件
问题描述
第三方写了一个文件上传的接口,该接口的请求方式为Post请求,请求参数全部是以form-data表单形式进行提交,包含三个参数
第一个:cookie(字符串类型)
第二个:seqNo(字符串类型)
第三个:file(文件类型)
解决方法
使用传统的Spring Cloud的Feign组件在调用远程接口实现文件上传时有时会出现异常错误,可考虑使用下述两种方式文件上传
第一种方式
使用RestTemplate进行调用
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; } /** * 覆写父类方法 * 如果不重写这个方法,并且文件有一定大小,那么服务端会出现异常 * {@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 会通过这个方法获取大小。然后当真正需要读取内容的时候,发现已经读完,会报如下错误。 */ @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); //构建请求体 MultiValueMaprequestBody = new LinkedMultiValueMap<>(); CommonInputStreamResource commonInputStreamResource = null; try { commonInputStreamResource = new CommonInputStreamResource(fileInputStream,file.length(),file.getName()); } catch (Exception e) { log.error("文件输入流转换错误",e); } requestBody.add("cookie", cookie); requestBody.add("seqNoFile", applySeqNo); requestBody.add("file",commonInputStreamResource); HttpEntity requestEntity = new HttpEntity (requestBody, requestHeaders); //直接调用远程接口 ResponseEntity responseEntity = restTemplate.postForEntity("http://xxx.xxx.xxx.xxx:8080/test/upload",requestEntity, String.class); System.out.println("返回结果:"+responseEntity.getBody())}catch (Exception e){ log.error("远程调用出现异常:", 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(MultiValueMapmultiValueMap);}
请求部分
@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("文件输入流转换错误:",e); } MultiValueMapdto=new LinkedMultiValueMap (); 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调用远程接口添加请求头
项目中我们经常会碰到与第三方系统对接,通过调用第三方系统中的接口来集成服务,为了接口的安全性都为加一些验证,比如:
basic、authority等,通过请求头添加authrization的机制比较容易接入,从第三方系统获取到authorization,然后请求接口时在请求头上带上获取到的authorization,说了怎么多不如直接上代码更容易理解。
// 获取第三方的authorizationString auth= OAuthContentHelper.getAuthorizationHeader();HttpHeaders requestHeader=new HttpHeaders();// 将获取到的authorization添加到请求头requestHeader.add(AuthConstants.AUTHORIZATION_HEADER,auth);// 构建请求实体HttpEntity
看完上述内容,你们对如何使用RestTemplate调用远程接口上传文件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。
接口
文件
方法
第三方
内容
方式
类型
错误
系统
三个
参数
大小
字符
字符串
组件
服务
输入
安全
代码
传统
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
高校邦信息安全与网络安全
人社网络安全工作汇报
网络技术四级题型
电子邮件的发送和接受服务器
湖北品质软件开发设施价钱
圣象服务器
ssm连接数据库时区
网络技术支撑的实习计划
编程网络技术培训
12核32g服务器算力
服务器s15949是什么游戏的
南京巨联电子网络技术服务部
鸿蒙系统升级连接服务器失败
互联网和高科技行业区别
当前网络安全形势对策
网络安全方向的研究方向
软件开发职业评级试题
软件开发盘古网络
金蝶数据库怎么恢复
超聚变服务器福建项目
用友服务器连接失败
服务器和显示器连接显示无信号
逃离塔科夫法国服务器怎么样
服务器连接怎么显示数据
今天lol端游服务器炸了
南京商林互联网科技有限公司
网络安全 后门
江西rpa软件开发
广东标准机架服务器如何选择
服务器里怎么有人说有一股臭味