- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章使用RestTemplate 调用远程接口上传文件方式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
第三方写了一个文件上传的接口,该接口的请求方式为Post请求,请求参数全部是以form-data表单形式进行提交,包含三个参数 。
使用传统的Spring Cloud的Feign组件在调用远程接口实现文件上传时有时会出现异常错误,可考虑使用下述两种方式文件上传 。
使用RestTemplate进行调用 。
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;
}
/**
* 覆写父类方法
* 如果不重写这个方法,并且文件有一定大小,那么服务端会出现异常
* {@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;
}
}
|
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);
//请求头设置为MediaType.MULTIPART_FORM_DATA类型
HttpHeaders requestHeaders =
new
HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
//构建请求体
MultiValueMap<String, Object> requestBody =
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<MultiValueMap> requestEntity =
new
HttpEntity<MultiValueMap>(requestBody, requestHeaders);
//直接调用远程接口
ResponseEntity<String> 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接口 。
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(
"文件输入流转换错误:"
,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);
}
}
|
项目中我们经常会碰到与第三方系统对接,通过调用第三方系统中的接口来集成服务,为了接口的安全性都为加一些验证,比如:
basic、authority等,通过请求头添加authrization的机制比较容易接入,从第三方系统获取到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);
// 构建请求实体
HttpEntity<Object> requestEntity=
new
HttpEntity(requestParam,requestHeaders);
// 使用restTemplate调用第三方接口
restTemplate.exchage(url,HttpMethod.POST,requestEntity,responseClass);
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.
原文链接:https://blog.csdn.net/y_bccl27/article/details/115088532 。
最后此篇关于使用RestTemplate 调用远程接口上传文件方式的文章就讲到这里了,如果你想了解更多关于使用RestTemplate 调用远程接口上传文件方式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我编写了以下代码来测试同步 RestTemplate 和 AsyncRestTemplate 的性能。我只是在 POSTMAN 上手动运行了几次。 我们只是将 10 个引用传递给 GET 调用,以便我
这种方式创建RestTemplate有什么区别 RestTemplate restTemplate = restTemplateBuilder .setConnectT
这个问题已经有答案了: IllegalArgumentException: Not enough variable values available with RestTemplate? (2 个回答
这是我的应用程序的主类 @SpringBootApplication (scanBasePackages = { "com.xyz.*" }) @EnableAsync @EnableAspectJA
我当前的代码: RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new
我将开发一个简单的 Spring MVC Web 应用程序,它将使用 Heroku 上的远程 RESTful 服务。 我希望 MVC Web 应用程序根据 Controller 调用 REST 服务。
项目场景: Spring 的 RestTemplate 是一个健壮的、流行的基于 Java 的 Http客户端。 RestTemplate实现request param参数传送,如果如下所示,直接传一
我想通过 RestTemplate 发送请求。但是我的网址有大括号('{','}'),因此我有异常(exception):“没有足够的变量值可用于扩展......”。 我尝试通过 uri UriCom
有一个 RestFull 方法返回一个菜单对象列表 public ResponseEntity> getMenus() { .. } 但我不知道如何从 RestTemplate 中获取它们,从 Res
摘要: RestTemplate与REST资源交互的方法涵盖了HTTP请求方法,包括get, post, put, delete。 本文分享自华为云社区《Springboot RestTemplate
我有一个 springboot 休息服务 A 使用 restTemplate 调用休息服务 B。休息服务 A 的 restTemplate bean 创建如下,超时设置如下面的代码片段所示。 @Bea
我有一个 @Service有几种方法,每种方法使用不同的 web api。每个调用都应该有一个自定义的读取超时。 拥有一个 RestTemplate 实例并在每个方法中通过工厂更改超时是否是线程安全的
这是我的休息模板配置, @Bean @Qualifier("myRestService") public RestTemplate createRestTemplate(@Va
是否可以使用 RestTemplateBuilder 创建仅带有不记名 header 和 token 的 RestTemplate 实例? 我知道我可以使用 RestTemplate 交换并在 Htt
我正在尝试对请求正文执行 DELETE,但我不断收到 400(错误请求)错误。当我在 swagger/postman 中这样做时,它成功地删除了记录。但是从 Java 代码我不能这样做 外部 API
我需要创建 RestTemplate 请求,它将发送图像以通过 PHP 应用程序上传。 我的代码是: Resource resource = new FileSystemResource("/User
我正在使用 swagger codegen ( on this Zoura swagger ) 创建 Java/rest 模板客户端。我正在使用 swagger Gradle 插件: id "org.
我有Restful API,当找不到某个项目时会响应404错误,但是根据未找到该项目的原因(未知,不可用等),会有不同的消息,可以使用Spring MVC通过以下方式完成: response.send
我正在使用 Spring 中的 RestTemplate 来查询搜索服务。我在进行正确的序列化方面遇到了一些困难。如果我使用此方法,restTemplate 将返回一个列表。我不明白如何传递参数化类型
我们有这样的代码,它使用 OData 来指定资源(为简单起见,在此处使用公司代码进行硬编码): String uri = "[my_endpoint]/companyprofiles.read?$fi
我是一名优秀的程序员,十分优秀!