cloud-service-sdk icon indicating copy to clipboard operation
cloud-service-sdk copied to clipboard

:package: 第三方云服务的sdk封装,包括有阿里云短信服务,阿里云oss对象存储,腾讯地图,腾讯云cos对象存储等服务,这些服务虽然都有专门提供sdk,但是现实接入的话,还是需要我们二次进行封装,比如签名、参数封装...

简介

第三方云服务的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

注意事项

阿里云OSS前端直传

这里需要注意下,实际前端直传的时候,请求的 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必须是表单中的最后一个域!,具体的可以参考官方的文档

腾讯云COS前端直传

put方式

请求后台接口: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方式

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 示例如下: