最近更新时间:2024.03.07 11:24:53
首次发布时间:2023.03.15 10:51:51
上传回调是指客户端在请求时携带回调(Callback)参数,服务端在上传完成后,发送同步的 POST 回调请求到 CallBack 中指定的第三方应用服务器,在服务器确认接受并返回结果后,才将所有结果返回给客户端。由于加入了回调请求和等待响应的过程,相比于普通上传会有更多的等待时间。
目前支持上传回调的接口如下:
上传回调的流程如下:
使用上传回调依赖客户端在请求时携带回调参数和回调参数变量。
回调参数是一段经过 Base64 编码的 JSON 格式字符串。示例如下:
// 示例 1,传递 application/json 类型的消息体 { "callbackUrl" : "http://domainname.com/callback", "callbackHost" : "alternative-domainname.com", "callbackBody" : "{\"bucket\" : ${bucket}, \"object\" : ${object}, \"key1\" : ${x:key1}, \"key2\" : ${x:key2}}", "callbackBodyType" : "application/json" } // 示例 2,传递 application/x-www-form-urlencoded 类型的消息体 { "callbackUrl" : "http://domain-name/callback", "callbackHost" : "alternative-domain-name", "callbackBody" : "bucket=${bucket}&object=${object}&key1=${x:key1}&key2=${x:key2}", "callbackBodyType" : "application/x-www-form-urlencoded" }
字段 | 作用描述 | 约束限制 |
---|---|---|
callbackUrl | 回调请求的 URL,用于指定回调请求的第三方应用服务的地址,TOS 服务在上传成功后会向该地址发送 HTTP/HTTPS 请求。 |
|
callbackHost | 回调请求发送时的 HOST 头域,用于替换 callbackUrl 中解析出的 HOST。 |
|
callbackBody | 回调请求发送时的消息体,格式需与 callbackBodyType 指定的类型匹配。 |
|
callbackBodyType | 回调请求的消息体类型(Content-Type),与 callbackBody 配套使用。 |
|
注意
回调参数中的 callbackBody 支持使用回调参数变量,分为系统内置变量和自定义变量(callback-var)两类,前者可以在 callbackBody 中直接使用,后者需要客户端在请求时一并携带。TOS 服务端会根据 JSON 格式解析出自定义变量并与系统内置变量合并为一组可用的键值对,用于 callbackBody 的中 ${variable_name} 和 ${x:variable_name} 形式变量的替换。
callbackBody 中可以设置的系统内置变量请参见下表。
注意
${}
操作符,例如 ${bucket} 代表获取上传的桶名。变量名 | 变量说明 | 变量类型 |
---|---|---|
bucket | 上传的桶名。 | string |
key | 上传的对象名。 | string |
object | 上传的对象名。 | string |
size | 上传对象的大小。 | int64 |
etag | 上传后对象的 ETag。 | string |
crc64ecma | 上传后对象的 CRC64。 | string |
versionId | 上传后对象的版本号,只在桶开启了多版本特性时有值。 | string |
filename | PostObject 上传的文件原名。 | string |
fname | PostObject 上传的文件原名。 | string |
mimeType | 上传对象时客户端指定的 Content-Type,客户端未指定时默认为 binary/octet-stream。 | string |
requestId | 本次请求的 Request ID。 | string |
客户端在请求时可携带 JSON 格式的自定义变量键值对,TOS 服务端会根据 JSON 格式解析出自定义变量用于 callbackBody 中变量的替换。如下所示,定义了四个自定义变量:
{ "x:key1" : "value1", // 定义字符串类型的字段 "x:key2" : 123, // 定义数字类型的字段 "x:key3" : ["value2", "value3"], // 定义数组类型的字段 "x:key4" : true // 定义布尔类型的字段 }
注意
x:
开头,否则视为不合法。上传回调支持的接口包括 PutObject、PostObject、CompleteMultipartUpload,其中 PutObject 及 CompleteMultipartUpload 可以使用 URL 或 Header 携带回调参数和自定义变量;PostObject 使用表单域携带回调参数和自定义变量。客户端构造上传回调请求的方式如下所示。
上传回调支持接口 | 支持的参数携带方式 | 参数定义 | 签名方式 | 约束限制 |
---|---|---|---|---|
PutObject CompleteMultipartUpload | Header 中携带参数 | Header 使用:
| 按照签名机制计算到 CanonicalHeaders 和 SignedHeaders 中。 |
|
URL 中携带参数 | Query 使用:
| 按照签名机制计算到 CanonicalQueryString 中。 | ||
PostObject | 使用 POST 表单域携带 |
| 按照 POST 上传对象时的签名机制将 x-tos-callback、x-tos-callback-var 和自定义变量放入表单上传的 policy 中做为 conditions。 |
|
参数说明
x-tos-callback
携带回调参数;通过 x-tos-callback-var
携带回调参数变量的自定义变量。x-tos-callback
携带回调参数;通过 x-tos-callback-var
携带回调参数变量的自定变量。x-tos-callback-var
携带,如果没有携带 x-tos-callback-var
,代表自定义变量的每个字段是通过表单域来单独传递的,例如:--9431149156168 Content-Disposition: form-data; name="x:key1" value1 --9431149156168 Content-Disposition: form-data; name="x:key2" 123
本文以第三方应用服务器对于 TOS 的回调请求返回响应 {"Status":"OK"},回调参数和回调参数变量如下为例,构造客户端上传回调请求:
// 回调参数: { "callbackUrl" : "http://domainname.com/callback", "callbackHost" : "alternative-domainname.com", "callbackBody" : "{\"bucket\" : ${bucket}, \"object\" : ${object}, \"key1\" : ${x:key1}, \"key2\" : ${x:key2}}", "callbackBodyType" : "application/json" } // 回调参数变量: { "x:key1" : "value1", "x:key2" : 123, } // 第三方应用服务返回的结果: {"Status":"OK"}
将回调参数和回调参数变量经过 Base64 编码
// 回调参数 Base64 Encode 得到 x-tos-callback: Cgl7CgkJImNhbGxiYWNrVXJsIiA6ICJodHRwOi8vZG9tYWlubmFtZS5jb20vY2FsbGJhY2siLCAKCQkiY2FsbGJhY2tIb3N0IiA6ICJhbHRlcm5hdGl2ZS1kb21haW5uYW1lLmNvbSIsICAgICAgICAgICAgICAgCgkJImNhbGxiYWNrQm9keSIgOiAie1wiYnVja2V0XCIgOiAke2J1Y2tldH0sIFwib2JqZWN0XCIgOiAke29iamVjdH0sIFwia2V5MVwiIDogJHt4OmtleTF9LCBcImtleTJcIiA6ICR7eDprZXkyfX0iLCAKCQkiY2FsbGJhY2tCb2R5VHlwZSIgOiAiYXBwbGljYXRpb24vanNvbiIgICAgICAgICAgICAgICAgCgl9 // 回调参数变量 Base64 Encode 得到 x-tos-callback-var: ewogICAgIng6a2V5MSIgOiAidmFsdWUxIiwKICAgICJ4OmtleTIiIDogMTIzLAp9
构造 PutObject 请求并在 Header 中携带回调参数和自定义变量
PUT /objectName HTTP/1.1 Host: bucketname.tos-cn-beijing.volces.com Date: Fri, 30 Jul 2021 08:05:36 +0000 x-tos-callback-var: ewogICAgIng6a2V5MSIgOiAidmFsdWUxIiwKICAgICJ4OmtleTIiIDogMTIzLAp9 x-tos-callback: Cgl7CgkJImNhbGxiYWNrVXJsIiA6ICJodHRwOi8vZG9tYWlubmFtZS5jb20vY2FsbGJhY2siLCAKCQkiY2FsbGJhY2tIb3N0IiA6ICJhbHRlcm5hdGl2ZS1kb21haW5uYW1lLmNvbSIsICAgICAgICAgICAgICAgCgkJImNhbGxiYWNrQm9keSIgOiAie1wiYnVja2V0XCIgOiAke2J1Y2tldH0sIFwib2JqZWN0XCIgOiAke29iamVjdH0sIFwia2V5MVwiIDogJHt4OmtleTF9LCBcImtleTJcIiA6ICR7eDprZXkyfX0iLCAKCQkiY2FsbGJhY2tCb2R5VHlwZSIgOiAiYXBwbGljYXRpb24vanNvbiIgICAgICAgICAgICAgICAgCgl9 Authorization: authorization_string Content-Type: text/plain Content-Length: 0
构造 CompleteMultipartUpload 请求并在 URL 中携带回调参数和自定义变量
POST /objectName?uploadId=UploadId&x-tos-callback=Cgl7CgkJImNhbGxiYWNrVXJsIiA6ICJodHRwOi8vZG9tYWlubmFtZS5jb20vY2FsbGJhY2siLCAKCQkiY2FsbGJhY2tIb3N0IiA6ICJhbHRlcm5hdGl2ZS1kb21haW5uYW1lLmNvbSIsICAgICAgICAgICAgICAgCgkJImNhbGxiYWNrQm9keSIgOiAie1wiYnVja2V0XCIgOiAke2J1Y2tldH0sIFwib2JqZWN0XCIgOiAke29iamVjdH0sIFwia2V5MVwiIDogJHt4OmtleTF9LCBcImtleTJcIiA6ICR7eDprZXkyfX0iLCAKCQkiY2FsbGJhY2tCb2R5VHlwZSIgOiAiYXBwbGljYXRpb24vanNvbiIgICAgICAgICAgICAgICAgCgl9&x-tos-callback-var=ewogICAgIng6a2V5MSIgOiAidmFsdWUxIiwKICAgICJ4OmtleTIiIDogMTIzLAp9 HTTP/1.1 Host: bucketname.tos-cn-beijing.volces.com Date: Fri, 30 Jul 2021 08:05:36 +0000 Authorization: authorization_string { "Parts":[{ "PartNumber":1, "ETag":"7de47c292287f7965357c1ddd724b2b7" }] }
构造 PostObject 请求并在表单域携带回调参数和自定义变量
POST / HTTP/1.1 Host: buketname.tos-cn-beijing.volces.com Content-Type: multipart/form-data; boundary=9431149156168 Content-Length: length --9431149156168 Content-Disposition: form-data; name="key" objectname --9431149156168 Content-Disposition: form-data; name="x-tos-callback" Cgl7CgkJImNhbGxiYWNrVXJsIiA6ICJodHRwOi8vZG9tYWlubmFtZS5jb20vY2FsbGJhY2siLCAKCQkiY2FsbGJhY2tIb3N0IiA6ICJhbHRlcm5hdGl2ZS1kb21haW5uYW1lLmNvbSIsICAgICAgICAgICAgICAgCgkJImNhbGxiYWNrQm9keSIgOiAie1wiYnVja2V0XCIgOiAke2J1Y2tldH0sIFwib2JqZWN0XCIgOiAke29iamVjdH0sIFwia2V5MVwiIDogJHt4OmtleTF9LCBcImtleTJcIiA6ICR7eDprZXkyfX0iLCAKCQkiY2FsbGJhY2tCb2R5VHlwZSIgOiAiYXBwbGljYXRpb24vanNvbiIgICAgICAgICAgICAgICAgCgl9 --9431149156168 Content-Disposition: form-data; name="x:key1" value1 --9431149156168 Content-Disposition: form-data; name="x:key2" 123 --9431149156168 Content-Disposition: form-data; name="x-tos-algorithm" TOS4-HMAC-SHA256 --9431149156168 Content-Disposition: form-data; name="x-tos-date" 20220411T000000Z --9431149156168 Content-Disposition: form-data; name="x-tos-credential" <your-access-key-id>/<date>/<region>/<service>/request --9431149156168 Content-Disposition: form-data; name="policy" base64encoded_policy --9431149156168 Content-Disposition: form-data; name="x-tos-signature" signature --9431149156168 Content-Disposition: form-data; name="file"; filename="MyFilename.jpg" Content-Type: image/jpeg file_content --9431149156168 Content-Disposition: form-data; name="submit" Upload to TOS --9431149156168--
TOS 服务端完成对象上传后,会根据上传请求中的回调参数配置发送 Post 请求调用第三方应用服务,第三方应用服务器实现的回调接口应满足以下约束。
约束项 | 要求 |
---|---|
接口协议 | HTTP、HTTPS,使用 HTTPS 协议时第三方应用服务必须有合法的证书。 |
支持方法 | POST |
请求消息体格式 | application/x-www-form-urlencoded、application/json |
响应状态码 | 200 |
响应消息体格式 | application/json |
响应消息体大小 | 不超过 3MB。 |
TOS 根据用户请求中的回调参数和回调参数变量,使用 Post 请求调用第三方服务器,示例如下:
POST /callback HTTP/1.1 Host: alternative-domainname.com Content-Length: 71 Content-Type: application/json {"bucket":"bucket-test","object":"key-test","key1":"value1","key2":123}
第三方应用服务器返回响应给 TOS,示例如下:
HTTP/1.1 200 OK Date: Fri, 1 Jul 2022 01:00:36 GMT Content-Length: 15 Content-Type: application/json {"Status":"OK"}
HTTP/1.1 200 OK x-tos-id-2: 367be10900210004-a444ed0 x-tos-request-id: 367be10900210004-a444ed0 Date: Fri, 30 Jul 2021 08:05:36 GMT server: TosServer Content-Length: 15 Content-Type: application/json ETag: 1c06e540e11d65a51aeb724e72fa641a {"Status":"OK"}
HTTP/1.1 200 OK x-tos-id-2: 9b84750a5bbc0029-a444ed0 x-tos-request-id: 9b84750a5bbc0029-a444ed0 Date: Fri, 30 Jul 2021 13:59:38 GMT server: TosServer Content-Length: 15 Content-Type: application/json Location: http://bucketname.tos-cn-beijing.volces.com/objectname ETag: 7de47c292287f7965357c1ddd724b2b7-1 {"Status":"OK"}
注意
HTTP/1.1 200 OK x-tos-id-2: 367be10900210004-a444ed0 x-tos-request-id: 367be10900210004-a444ed0 Date: Fri, 1 Jul 2022 01:00:36 GMT Server: TosServer Content-Length: 15 Content-Type: application/json ETag: ab7abb0da4bca5323ab6119bb5dcd296 Location: http://bucketname.tos-cn-beijing.volces.com/objectname {"Status":"OK"}
注意