第三方云服务的sdk封装,包括有阿里云短信服务,阿里云oss对象存储,腾讯地图WebService API,腾讯云cos对象存储等服务,这些服务虽然都有专门提供sdk,但是现实接入的话,还是需要我们二次进行封装,比如签名、参数封装等,引入二次封装后的sdk,可以避免你再次踩坑,直接使用。
- 阿里云短信服务:
- 阿里云对象存储:
- 腾讯云对象存储:
- 腾讯地图:
tencent-lbs-sdk
:腾讯地图 webServiceAPI 接口封装tencent-cos-sdk
:腾讯云对象存储封装aliyun-oss-sdk
:阿里云对象存储封装aliyun-sms-sdk
:阿里云短信封装sdk-base
:基础依赖包test-demo
:示例 demo
- 配置类:这些配置类里面的属性,在对应的云服务商控制台都能找到
aliyun-oss.properties
aliyun-sms.properties
tencent-cos.properties
tencent-lbs.properties
- 工具类:
AliOssUtil
:阿里云对象存储相关AliSmsUtil
:阿里短信服务相关TencentCosUtil
:腾讯对象存储相关TencentLbsUtil
:腾讯地图 webServiceAPI 接口相关
- JDK 1.8+
- Spring Boot 2.x
修改各个sdk classpath 下的 xxx.properties
文件,填写对应的配置,然后进入本项目根目录,执行 mvn clean install
命令,安装完毕后,在你的项目中引入如下依赖即可,这里我以引入腾讯地图为例:
<!-- 腾讯地图webServiceAPI sdk -->
<dependency>
<groupId>com.leeyom</groupId>
<artifactId>tencent-lbs-sdk</artifactId>
<version>${tencetn-lbs-sdk.version}</version>
</dependency>
然后直接使用 TencentLbsUtil
工具类,即可调用对应的接口,不需关心参数签名等细节:
/**
* 具体的地址信息转经纬度坐标
*
* @param address 详细地址,比如:北京市海淀区彩和坊路海淀西大街74号
* @return 经纬度
*/
@GetMapping("addressToLocation")
public ApiResponse<LocationDTO> addressToLocation(String address) {
return ApiResponse.ofSuccess(TencentLbsUtil.addressToLocation(address));
}
更多具体示例,可以参考示例项目:test-demo
这里需要注意下,实际前端直传的时候,请求的 content-type 为 form-data,请求方式为 post,前端先调用后台接口:http://localhost:8080/demo/aliyunOss/getOssPolicy
(先启动示例项目:test-demo
),获取直传策略参数,返回的示例:
{
"code": 200,
"message": "操作成功!",
"data": {
"aliyunOssPolicy": {
// Bucket拥有者的AccessKey Id
"ossAccessKeyId": "xxx",
// Policy规定了请求表单域的合法性
"policy": "xxx",
// 根据AccessKeySecret和Policy计算的签名信息
"signature": "xxx",
// 前端直传的请求链接
"host": "https://xxx.oss-cn-beijing.aliyuncs.com",
// 上传Object的名称。如果名称包含路径,例如destfolder/example.jpg
"key": "xxx/xxx.jpg"
},
// 前端上传完后,文件实际的访问地址,把这个地址告诉给后台
"fileUrl": "http://xxx.oss-cn-beijing.aliyuncs.com/xxx/xxx.jpg"
}
}
拿到直传参数后,前端正式向阿里云发起上传请求(host字段指定的域名),这里 postman 示例: 注意:file必须是表单中的最后一个域!,具体的可以参考官方的文档
请求后台接口:http://localhost:8080/demo/tencentCos/getPreSignedUrlForPut
(先启动示例项目:test-demo
)拿到预签名地址 preSignUrl
:
{
"code": 200,
"message": "操作成功!",
"data": {
// 前端直传的请求链接
"preSignUrl": "https://retail-cos.aqara.cn/retail_image_fat/e5809dfe63b94ebba89fb20749d74f62.jpg?xxx",
// 前端上传完后,文件实际的访问地址,把这个地址告诉给后台
"fileUrl": "https://xxx/retail_image_fat/e5809dfe63b94ebba89fb20749d74f62.jpg"
}
}
前端拿到预签名地址后,发起 put 上传请求,将文件域放到binary
里面,postman示例如下:
然后将 fileUrl
回传给后台即可!
post方式其实跟阿里云OSS处理方式一样,后台返回直传策略参数,然后前端 post直接发起上传请求,请求后台接口:http://localhost:8080/demo/tencentCos/getPreSignedUrlForPost
,返回策略参数:
{
"code": 200,
"message": "操作成功!",
"data": {
"formFields": {
"q-sign-algorithm": "sha1",
"q-ak": "xx",
"q-signature": "xx",
"q-key-time": "xx",
"key": "xxx",
"policy": "xxx"
},
"preSignUrl": "https://xxx.cn",
"fileUrl": "https:/xxx.cn/retail_image_fat/7dca24d58ac24e8894a6b65c91df8042.jpg"
}
}
formFields
里面的数据就是直传策略参数,拿到直传策略参数后,前端再次发起post请求,请求的 content-type 为 form-data,postman 示例如下: