IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 实现Dart版本对象存储(COS)插件 -> 正文阅读

[移动开发]实现Dart版本对象存储(COS)插件

前言

Flutter Web 在《一起漫部》的性能优化探索与实践 一文中,
在做加载优化时需要实现资源文件cdn化,意味着要将资源文件上传到腾讯的COS或者阿里的OSS这样的第三方对象存储服务器。 目前公司使用的是腾讯的对象存储(COS),原本想用官方提供的SDK去实现资源上传功能,但是官方并没有提供Dart版本的SDK, 去pub.dev搜了下关于cos的相关插件,也没有找到功能相对完善的插件,于是便打算手写一个Dart版本对象存储(COS)插件。

简介

在官方提供的API功能过于丰富和时间有限的情况下,只实现了部分功能:

  • 支持Bucket接口的基本操作,增加、删除、查询存储桶等
  • 支持Bucket接口的访问控制(acl)
  • 支持Bucket接口的跨域资源共享(cors)
  • 支持Bucket接口的防盗链(referer)
  • 支持Object接口的基本操作,上传、删除、查询存储对象等
  • 支持Object接口的访问控制(acl)

结构

工程主要包括示例(example)、核心代码(lib)和单元测试(test)三部分

├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── example                                         // 示例
├── lib                                             // 核心代码
│   ├── src
│   │   ├── api
│   │   ├── client
│   │   ├── model
│   │   └── src.dart
│   └── tencent_cos_plus.dart
├── pubspec.lock
├── pubspec.yaml
├── tencent_cos_plus.iml
└── test                                            // 单元测试

示例

示例目前仅包括tencent_cos_plus_example.dart文件,主要是介绍如何使用插件,包括初始化配置、存储桶Api调用和存储对象 Api调用。

├── example
│   └── tencent_cos_plus_example.dart

核心代码

核心代码(lib)部分由clientapimodel三层构成:

  • client层封装了http请求和接口签名功能
  • api层实现了存储桶(bucket)和存储对象(object)部分api的调用
  • model层负责xml数据和实体对象的解析
├── api
│   ├── api.dart
│   ├── cos_abstract_api.dart
│   ├── cos_api_factory.dart
│   ├── cos_api_mixin.dart
│   ├── cos_bucket_api.dart
│   └── cos_object_api.dart
├── client
│   ├── client.dart
│   └── cos_client.dart
├── model
│   ├── common
│   │   ├── cos_access_control_policy.dart
│   │   ├── cos_common.dart
│   │   ├── cos_config.dart
│   │   ├── cos_cors_configuration.dart
│   │   ├── cos_exception.dart
│   │   └── cos_referer_configuration.dart
│   ├── model.dart
│   ├── request
│   │   ├── cos_bucket_acl_header.dart
│   │   ├── cos_create_bucket_configuration.dart
│   │   ├── cos_delete.dart
│   │   ├── cos_get_object.dart
│   │   └── cos_restore_request.dart
│   └── response
│       ├── cos_copy_object_result.dart
│       ├── cos_delete_result.dart
│       ├── cos_list_all_my_buckets_result.dart
│       ├── cos_list_bucket_result.dart
│       └── cos_list_versions_result.dart

单元测试

单元测试包括cos_bucket_api_test.dartcos_object_api_test.dart两个文件,主要是覆盖了存储桶(bucket)
和存储对象(object)部分api的单元测试

└── test
    ├── cos_bucket_api_test.dart
    └── cos_object_api_test.dart

使用说明

关于如何使用,请参考 README

碰到的问题

在开发过程中,实现需要提交xml数据的接口时,出现签名不匹配的问题。

<?xml version='1.0' encoding='utf-8' ?>
<Error>
	<Code>SignatureDoesNotMatch</Code>
	<Message>The Signature you specified is invalid.</Message>
	<StringToSign>sha1
1666158568;1666218568
488ab174d5f7a6ec0966aeeb82600e185114d7d1
</StringToSign>
	<FormatString>put
/
cors=
content-length=454&amp;content-md5=DfuiC7IOBwIeiVanWPG%2FKg%3D%3D&amp;content-type=application%2Fxml%3B%20charset%3Dutf-8&amp;date=Wed%2C%2019%20Oct%202022%2005%3A49%3A28%20GMT&amp;host=test-app-1251021022.cos.ap-guangzhou.myqcloud.com
</FormatString>
	<Resource>/</Resource>
	<RequestId>NjM0ZjhmZThfNDgzNjQwMGJfMTMwZWFfNDhmODEyZg==</RequestId>
	<TraceId>OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTBjYzE2MjAxN2M1MzJiOTdkZjMxMDVlYTZjN2FiMmI0MjFmNzE4ZjVmM2M0ZTcxNjYwMmQ3N2QzYjA3NzYyNmM=</TraceId>
</Error>

出现这个问题后,先是确认了签名文档提供的签名规则是否一致,然后使用 COS 签名工具
去验证签名结果是否一致,发现在都没有问题。最后通过api接口返回的错误信息,发现参与签名的content-type和提交给api的content-type
不一致,导致签名不匹配。
在这里插入图片描述
在这里插入图片描述
通过断点调试,排查到是使用的 http 插件造成的,在设置body时如果content-type没有charset时会赋值默认的charset,问题找到了。

其它

  • 目前不足的是上传文件和下载文件时,没有进度的回调

总结

整个插件实现起来不难,主要需要花时间阅读腾讯对象存储(COS)文档,根据Api文档进行封装和测试,这里开源出来给需要的人提供帮助。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:26:57  更:2022-10-22 21:29:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:05:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码