前言
本文致力于提供简洁明了的解决方案以及技术详解,故请详细看代码注释。
前提条件
- Retrofit2 - 2.9.0
- Converter-GSON - 2.9.0
- 阿里云
- 函数计算
- OSS对象存储
Maven配置
<!--Retrofit2-->
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-gson</artifactId>
<version>2.9.0</version>
</dependency>
请求流程
graph LR
开始 --> 获取Path --> 发送请求 --> 等待3xx状态码 --> 认定成功 --> 结束
相关Java类
/**
* 数据传输体
*/
@Data
public class FunctionCalculationEntity {
@SerializedName("bucket")
private String bucket;
@SerializedName("source-dir")
private String sourceDir;
@SerializedName("source-files")
private List<String> sourceFiles;
@SerializedName("dest-file")
private String destFile;
}
/**
* 重定向拦截器
*/
public class BodyInterceptor implements Interceptor {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
okhttp3.Response response = chain.proceed(request);
if (response.isRedirect()) {
String location = response.header("Location");
return response.newBuilder()
.code(200) // 将状态码改为200
.message(location) // 将重定向地址作为响应消息
.build();
}
return response;
}
}
Controller
/**
* OSS
*/
@Component
@Slf4j
public class OSS{
private OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.addInterceptor(new BodyInterceptor())
.followRedirects(false)
.followSslRedirects(false)
.build();
public final FunctionCalculationService service = new Retrofit.Builder()
.baseUrl("函数计算地址")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
.create(FunctionCalculationService.class);
}
Service
/**
* Retrofit请求
*/
public interface FunctionCalculationService {
@Headers({"Content-Type: application/json;charset=UTF-8"})
@POST("/")
Call<Void> zipFiles(@Body FunctionCalculation functionCalculation);
}
请注意:若这里添加
X-Fc-Invocation-Type: Async请求头,则不需要拦截器用于拦截重定向请求。
添加
X-Fc-Invocation-Type: Async是指该HTTP函数为异步函数,无需等待结果返回。并且请求成功后返回代码是201,符合Retrofit对请求成功的检测。
疑问
- 为什么选用
Retrofit作为请求客户端?不是还有restTemplate么?
原因有很多,这里举例几个最直接的原因:
- Retrofit默认支持超时时间,而restTemplate并不支持。
- Retrofit我使用的比较顺手,restTemplate是我在接触SpringBoot之后才会使用的东西。
- Retrofit可以统一管理请求地址,restTemplate比较分散不易集中管理。
总结
这篇文章是关于如何使用阿里云的函数计算和OSS对象存储来实现文件压缩的功能。文章主要包括以下几个部分:
- 前言:介绍了文章的目的和范围,以及需要用到的技术和工具。
- 前提条件:列出了文章所依赖的Maven依赖和版本,以及阿里云的服务和产品。
- Maven配置:给出了如何在pom.xml文件中添加Retrofit2和Converter-GSON的依赖。
- 请求流程:用流程图展示了文件压缩的请求过程,从获取路径到发送请求到等待响应。
- 相关Java类:定义了数据传输体和重定向拦截器两个Java类,用于封装请求参数和处理重定向响应。
- Controller:创建了OSS类,用于初始化OkHttpClient和Retrofit对象,并创建FunctionCalculationService接口的实例。
- Service:定义了FunctionCalculationService接口,用于声明zipFiles方法,该方法用于向函数计算地址发送POST请求,并传递FunctionCalculation对象作为请求体。