Skip to content

Latest commit

 

History

History
200 lines (136 loc) · 25.5 KB

回调.md

File metadata and controls

200 lines (136 loc) · 25.5 KB

回调

功能介绍

用户可以在上传对象请求中设置回调参数,OBS在对象上传成功之后,将上传结果回调特定服务器,并将回调结果返回给用户。

说明: 目前只在POST上传对象、PUT上传对象以及多段操作中的合并段API中支持回调功能。 在对象上传成功之后才会回调特定服务器,如果对象上传失败则不会回调。 回调成功,返回回调结果给客户端,同时将上传对象的Etag以头域返回,当回调结果也包含Etag时,将对Etag拼接后返回。 回调失败,返回203,表示对象上传成功但是回调失败。 如果上传的图片大小超过25M,则无法通过imageInfo相关魔法变量获取图片基本信息,会导致回调失败。

POST上传对象API中,回调参数可以在表单中携带,也可以在policy中携带。两者只能选择其一。

如果在表单中携带,每个回调参数都需要增加一个表单元素,回调参数可以不做条件校验,即不需要在policy的conditions中增加回调参数。这种方式支持在回调消息体中使用用户自定义变量,自定义变量通过“x:”前缀携带。

如果通过policy携带,则不需要增加表单元素。但是不支持用户自定义变量,仅能使用系统变量。

通过表单携带的回调参数如表1所示。

表 1 表单回调参数

参数名称 描述 是否必选
callbackUrl 对象上传成功之后,OBS向此url发送回调请求,请求方法为POST。支持设置多个url,以英文分号(;)分隔,最多支持10个。callbackUrl需要做url编码。例如:“http://www.example.com/中文?key=中文名”需要编码成“http://www.example.com/%E4%B8%AD%E6%96%87?key=%E4%B8%AD%E6%96%87%E5%90%8D”。类型:String
callbackHost 发起回调请求的Host头域的值,如果不设置,会使用callbackUrl解析出来的Host。类型:String
callbackBody 发起回调请求的body体。body体格式必须符合callbackBodyType中设置的媒体类型。回调body体支持系统变量和自定义变量,系统变量如表3所示,自定义变量就是以x:开头的变量。例如:key=$(key)&hash=$(etag)&fileid=$(x:fileid),其中变量key、etag是系统变量,x:fileid是自定义变量。如果用户上传的对象是图片,可以在参数中设置imageInfo.width和imageInfo.height表示该图片的宽高。例如:key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)。类型:String
callbackBodyType 发起回调请求的Content-Type头域的值。支持application/x-www-form-urlencoded、application/json。如果不设置,默认为application/json。类型:String
x:* 用户自定义变量,必须以 x: 开头。

通过policy携带的回调参数如表2所示。

表 2 policy回调参数

参数名称 描述 是否必选
url 对象上传成功之后,OBS向此url发送回调请求,请求方法为POST。支持设置多个url,以英文分号(;)分隔,最多支持10个。url需要做url编码。例如:“http://www.example.com/中文?key=中文名”需要编码成“http://www.example.com/%E4%B8%AD%E6%96%87?key=%E4%B8%AD%E6%96%87%E5%90%8D”。类型:String
host 发起回调请求的Host头域的值,如果不设置,会使用url解析出来的Host。类型:String
body 发起回调请求的body体。body体格式必须符合body-type中设置的媒体类型。body的内容必须经过URL安全base64编码。回调body体支持使用系统变量,系统变量如表3所示。例如:key=$(key)&hash=$(etag),其中变量key、etag是系统变量,则body参数为:a2V5PSQoa2V5KSZoYXNoPSQoZXRhZyk=,是key=$(key)&hash=$(etag)的base64编码。如果用户上传的对象是图片,可以在参数中设置imageInfo.width和imageInfo.height表示该图片的宽高。例如:key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height),body参数为:a2V5PSQoa2V5KSZoYXNoPSQoZXRhZykmdz0kKGltYWdlSW5mby53aWR0aCkmaD0kKGltYWdlSW5mby5oZWlnaHQp类型:String
body-type 发起回调请求的Content-Type头域的值。支持application/x-www-form-urlencoded、application/json。如果不设置,默认为application/json。类型:String

表 3 回调body体支持的系统变量

变量名称 参数类型 描述
fname String 上传的原始文件名。
fsize String 文件的大小,单位为字节。名称兼容size。
etag String 对象的ETag。
bucket String 上传的对象所属桶名。
key String 上传的对象名。
ext String 上传文件的后缀名,通过自动检测的mimeType或者$(fname)的后缀来获取。名称兼容mimeType。
override String 上传对象是否产生覆盖,值只会是true或false。上传对象的对象名在桶中已存在,即会产生覆盖,override为true,否则为false。当桶开启多版本时,不会产生覆盖写,override始终为false。
imageInfo String 获取所上传图片的基本信息。只支持上传图片的场景。该变量包含$(imageInfo.width)和$(imageInfo.height)两个子字段,分别表示图片的宽度和高度。如果上传的图片大小超过25M,则无法通过imageInfo相关魔法变量获取图片基本信息,会导致回调失败。

PUT上传对象以及合并段API中,回调参数可以通过头域x-obs-callback或者请求参数x-obs-callback携带,二者只能选择其一。二者共存时,只有头域x-obs-callback携带的回调参数生效,携带的回调策略必须为经过BASE64编码的JSON字符串,该JSON字符串中能够携带的回调参数同表1,但是暂不支持自定义变量,回调body体支持的系统变量同表3

说明: PUT上传对象以及合并段API中,使用回调时,与POST上传对象使用回调主要有以下几点不同:

  1. 回调参数是通过头域x-obs-callback或者请求参数x-obs-callback携带,携带的回调策略必须是经过BASE64编码的JSON字符串,否则OBS将返回400,Invalid Base64 encoding,对象上传失败。
  2. callbackUrl未配置或者配置为空时,视为未配置回调策略,对象仍正常上传,不执行回调。
  3. 不支持自定义变量。

JSON回调策略正确示例1:

{
"callbackUrl":"http://www.example.com/callback",
"callbackBody": "{\"bucket\":\"$(bucket)\",\"key\":\"$(key)\",\"override\":\"$(override)\"}",
"callbackBodyType":"application/json"
}

JSON回调策略正确示例2:

{
"callbackUrl":"http://www.example.com/callback1;http://www.example.com/callback2",
"callbackBody":"bucket=$(bucket)&key=$(key)&override=$(override)"
}

请求消息样式

通过表单携带回调参数的请求消息样式与POST上传对象相同,参考POST上传。policy的内容包含失效时间和条件元素,参考基于浏览器上传的表单中携带签名

通过policy携带回调参数的policy如下所示,比普通的policy增加了回调参数“callback”。请求消息样式与POST上传对象相同,参考POST上传

{ "expiration": "2017-12-31T12:00:00.000Z",
  "conditions": [
    {"x-obs-acl": "public-read" },
    {"x-obs-security-token": "YwkaRTbdY8g7q...." },
    {"bucket": "book" },
    ["starts-with", "$key", "user/"]
  ],
  "callback": [
    {"url": "http://www.example.com/callback" },
    {"host": "www.example.com" },
    {"body": "eyJrZXkiOiIkKGtleSkiLCJoYXNoIjoiJChldGFnKSJ9"},
    {"body-type": "application/json"}
  ]
}

在PUT上传对象和合并段API中,首先按照上文所述,构造JSON回调策略字符串,随后使用BASE64对其编码后,通过头域x-obs-callback或者请求参数x-obs-callback携带即可。

须知: OBS在计算CanonicalizedHeaders和CanonicalizedResource时,会分别将头域x-obs-callback以及请求参数x-obs-callback纳入签名计算的范围,参考用户签名验证

响应消息样式

HTTP/1.1 status_code
Content-Type: type
Server: OBS
Date: date
x-obs-request-id: request-id 
Content-Length: length
ETag: etag

须知: 在合并段API中,不使用回调功能时,响应消息body体中为合并段的结果(XML格式),参考合并段,当使用回调功能时,响应消息body体中为回调服务器返回的响应消息body体的内容,例如{"status":"success"}

返回码

带回调参数的POST上传对象的返回码与普通POST上传对象不同。普通POST上传对象HTTP状态码是“204 No Content”。带回调参数的POST上传对象、PUT上传对象以及合并段返回结果是回调结果,如果回调成功,一般会返回“200 OK”,如果回调失败,会返回203。

表 4 回调请求返回码

HTTP状态码 说明
200 OK 上传对象成功,并且回调成功。
203 Non Authoritative Information 上传对象成功,但是回调失败。

请求示例

下面的几张表提供了一些回调请求的示例。

表 5 通过policy携带回调参数

请求 说明
POST / HTTP/1.1Host: examplebucket.obs.cn-north-4.myhuaweicloud.comContent-Type: multipart/form-data; boundary=---------------------------7e329d630b26Content-Length: 1597-----------------------------7e32de17c166aContent-Disposition: form-data; name="key"file/obj1-----------------------------7e32de17c166aContent-Disposition: form-data; name="AccessKeyId"UYNVCM2JJES4APB9FZUG-----------------------------7e32de17c166aContent-Disposition: form-data; name="policy"ewogICJleHBpcmF0aW9uIjogIjIwMjAtMTAtMDFUMTI6MDA6MDAuMDAwWiIsCiAgImNvbmRpdGlvbnMiOiBbCiAgICB7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0In0sCiAgICBbImVxIiwgIiRrZXkiLCAiZmlsZS9vYmoxIl0KICBdLAogICJjYWxsYmFjayI6IFsKICAgIHsidXJsIjogImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY2FsbGJhY2sifSwKICAgIHsiYm9keSI6ICJleUpyWlhraU9pSWtLR3RsZVNraUxDSm9ZWE5vSWpvaUpDaGxkR0ZuS1NKOSJ9LAogICAgeyJib2R5LXR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9CiAgICBdCn0-----------------------------7e32de17c166aContent-Disposition: form-data; name="signature"w0nW7iiC4Wfav9SXkU/NiSI99E8=-----------------------------7e32de17c166aContent-Disposition: form-data; name="file"; filename="E:\TEST_FILE\TEST.txt"Content-Type: text/plain123456---------------------------7e32de17c166aContent-Disposition: form-data; name="submit"Upload-----------------------------7e32de17c166a-- 其中policy为:{"expiration": "2020-10-01T12:00:00.000Z","conditions": [{"bucket": "examplebucket"},["eq", "$key", "file/obj1"]],"callback": [{"url": "http://www.example.com/callback"},{"body": "eyJrZXkiOiIkKGtleSkiLCJoYXNoIjoiJChldGFnKSJ9"},{"body-type": "application/json"}]}回调body为:{"key":"$(key)","hash":"$(etag)"}其中系统变量key=file/obj1,etag=f447b20a7fcbf53a5d5be013ea0b15af,最终回调的消息体是:{"key":"file/obj1","hash":"f447b20a7fcbf53a5d5be013ea0b15af"}

表 6 通过表单携带回调参数,回调请求中只使用系统变量

请求 说明
POST / HTTP/1.1Host: examplebucket.obs.cn-north-4.myhuaweicloud.comContent-Type: multipart/form-data; boundary=---------------------------7e329d630b26Content-Length: 1597-----------------------------7e32de17c166aContent-Disposition: form-data; name="key"file/obj1-----------------------------7e32de17c166aContent-Disposition: form-data; name="AccessKeyId"UYNVCM2JJES4APB9FZUG-----------------------------7e32de17c166aContent-Disposition: form-data; name="policy"ewogICJleHBpcmF0aW9uIjogIjIwMjAtMTAtMDFUMTI6MDA6MDAuMDAwWiIsCiAgImNvbmRpdGlvbnMiOiBbCiAgICB7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0In0sCiAgICBbImVxIiwgIiRrZXkiLCAiZmlsZS9vYmoxIl0KICBdCn0-----------------------------7e32de17c166aContent-Disposition: form-data; name="signature"w0nW7iiC4Wfav9SXkU/NiSI99E8=-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackUrl"http://my.callback.com:8080/api/callback-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackBody"key=$(key)&hash=$(etag)&fname=$(fname)&fsize=$(size)-----------------------------7e32de17c166aContent-Disposition: form-data; name="file"; filename="E:\TEST_FILE\TEST.txt"Content-Type: text/plain123456---------------------------7e32de17c166aContent-Disposition: form-data; name="submit"Upload-----------------------------7e32de17c166a-- 其中policy为:{"expiration": "2020-10-01T12:00:00.000Z","conditions": [{"bucket": "examplebucket"},["eq", "$key", "file/obj1"]]}policy中可以不包含callbackUrl和callbackBody这两个回调参数。bucket、key为必须包含的表单元素。回调body为:key=$(key)&hash=$(etag)&fname=$(fname)&fsize=$(size)其中系统变量key=file/obj1,etag=f447b20a7fcbf53a5d5be013ea0b15af,fname=E:\TEST_FILE\TEST.txt,fsize=7。最终回调的消息体是:key=file/obj1&hash=f447b20a7fcbf53a5d5be013ea0b15af&fname=E:\TEST_FILE\TEST.txt&fsize=7

表 7 通过表单携带回调参数,回调请求中使用系统变量和自定义变量,同时设置自定义元数据

请求 说明
POST / HTTP/1.1Host: examplebucket.obs.cn-north-4.myhuaweicloud.comContent-Type: multipart/form-data; boundary=---------------------------7e329d630b26Content-Length: 1597-----------------------------7e32de17c166aContent-Disposition: form-data; name="key"file/obj1-----------------------------7e32de17c166aContent-Disposition: form-data; name="AccessKeyId"UYNVCM2JJES4APB9FZUG-----------------------------7e32de17c166aContent-Disposition: form-data; name="policy"ewogICJleHBpcmF0aW9uIjogIjIwMjAtMTAtMDFUMTI6MDA6MDAuMDAwWiIsCiAgImNvbmRpdGlvbnMiOiBbCiAgICB7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0In0sCiAgICBbImVxIiwgIiRrZXkiLCAiZmlsZS9vYmoxIl0sCgl7Ingtb2JzLW1ldGEtdGVzdDEiOiJ2YWx1ZTEifQogIF0KfQ-----------------------------7e32de17c166aContent-Disposition: form-data; name="signature"w0nW7iiC4Wfav9SXkU/NiSI99E8=-----------------------------7e32de17c166aContent-Disposition: form-data; name="x-obs-meta-test1"value1-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackUrl"http://my.callback.com:8080/api/callback-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackBody"{"bucketName": "$(bucket)","key": "$(key)","hash": "$(etag)","id": "$(x:id)","createtime": "$(x:time)"}-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackHost"my.callback.com-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackBodyType"application/json-----------------------------7e32de17c166aContent-Disposition: form-data; name="x:id"test-example-id-----------------------------7e32de17c166aContent-Disposition: form-data; name="x:time"2019-12-06 18:01:34-----------------------------7e32de17c166aContent-Disposition: form-data; name="file"; filename="E:\TEST_FILE\TEST.txt"Content-Type: text/plain123456---------------------------7e32de17c166aContent-Disposition: form-data; name="submit"Upload-----------------------------7e32de17c166a-- 其中policy为:{"expiration": "2020-10-01T12:00:00.000Z","conditions": [{"bucket": "examplebucket"},["eq", "$key", "file/obj1"],{"x-obs-meta-test1":"value1"}]}policy中可以不包含callbackUrl、callbackBody、callbackHost、callbackBodyType、x:id、x:time这六个回调参数。bucket、key、x-obs-meta-test1为必须包含的表单元素。回调body为:{"bucketName": "$(bucket)","key": "$(key)","hash": "$(etag)","id": "$(x:id)","createtime": "$(x:time)"}其中系统变量bucket=examplebucket,key=file/obj1,etag=f447b20a7fcbf53a5d5be013ea0b15af,自定义变量x:id=test-example-id,x:time=2019-12-06 18:01:34。最终回调的json消息体是:{"bucketName": "examplebucket","key": "file/obj1","hash": "f447b20a7fcbf53a5d5be013ea0b15af","id": "test-example-id","createtime": "2019-12-06 18:01:34"}

表 8 通过表单携带回调参数,并且校验部分回调参数

请求 说明
POST / HTTP/1.1Host: examplebucket.obs.cn-north-4.myhuaweicloud.comContent-Type: multipart/form-data; boundary=---------------------------7e329d630b26Content-Length: 1597-----------------------------7e32de17c166aContent-Disposition: form-data; name="key"file/obj1-----------------------------7e32de17c166aContent-Disposition: form-data; name="AccessKeyId"UYNVCM2JJES4APB9FZUG-----------------------------7e32de17c166aContent-Disposition: form-data; name="policy"eyJleHBpcmF0aW9uIjogIjIwMjAtMTAtMDFUMTI6MDA6MDAuMDAwWiIsImNvbmRpdGlvbnMiOiBbeyJidWNrZXQiOiAiZXhhbXBsZWJ1Y2tldCJ9LFsiZXEiLCAiJGtleSIsICJmaWxlL29iajEiXSx7Ingtb2JzLW1ldGEtdGVzdDEiOiJ2YWx1ZTEifSx7ImNhbGxiYWNrVXJsIjoiaHR0cDovL215LmNhbGxiYWNrLmNvbTo4MDgwL2FwaS9jYWxsYmFjayJ9LHsiY2FsbGJhY2tCb2R5Ijoie1wiYnVja2V0TmFtZVwiOiAkKGJ1Y2tldCksXCJrZXlcIjogJChrZXkpLFwiaGFzaFwiOiAkKGV0YWcpLFwiaWRcIjogJHt4OmlkfSxcImNyZWF0ZXRpbWVcIjogJHt4OnRpbWV9fSJ9LHsieDp0aW1lIjoiMjAxOS0xMi0wNiAxODowMTozNCJ9XX0-----------------------------7e32de17c166aContent-Disposition: form-data; name="signature"w0nW7iiC4Wfav9SXkU/NiSI99E8=-----------------------------7e32de17c166aContent-Disposition: form-data; name="x-obs-meta-test1"value1-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackUrl"http://my.callback.com:8080/api/callback-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackBody"{"bucketName": $(bucket),"key": $(key),"hash": $(etag),"id": $(x:id),"createtime": $(x:time)}-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackHost"my.callback.com-----------------------------7e32de17c166aContent-Disposition: form-data; name="callbackBodyType"application/json-----------------------------7e32de17c166aContent-Disposition: form-data; name="x:id"test-example-id-----------------------------7e32de17c166aContent-Disposition: form-data; name="x:time"2019-12-06 18:01:34-----------------------------7e32de17c166aContent-Disposition: form-data; name="file"; filename="E:\TEST_FILE\TEST.txt"Content-Type: text/plain123456---------------------------7e32de17c166aContent-Disposition: form-data; name="submit"Upload-----------------------------7e32de17c166a-- 其中policy为:{"expiration": "2020-10-01T12:00:00.000Z","conditions": [{"bucket": "examplebucket"},["eq", "$key", "file/obj1"],{"x-obs-meta-test1":"value1"},{"callbackUrl":"http://my.callback.com:8080/api/callback"},{"callbackBody":"{"bucketName": $(bucket),"key": $(key),"hash": $(etag),"id": $(x:id),"createtime": $(x:time)}"},{"x:time":"2019-12-06 18:01:34"}]}policy中包含了callbackUrl、callbackBody、x:time这三个回调参数,会对这三个参数做条件校验,没有包含callbackHost、callbackBodyType、x:id这三个回调参数,不对这三个参数做条件校验。policy中可以不包含回调参数,也可以包含部分/全部回调参数。bucket、key、x-obs-meta-test1为必须包含的表单元素。回调body为:{"bucketName": $(bucket),"key": $(key),"hash": $(etag),"id": $(x:id),"createtime": $(x:time)}其中系统变量bucket=examplebucket,key=file/obj1,etag=f447b20a7fcbf53a5d5be013ea0b15af,自定义变量x:id=test-example-id,x:time=2019-12-06 18:01:34。最终回调的json消息体是:{"bucketName": "examplebucket","key": "file/obj1","hash": "f447b20a7fcbf53a5d5be013ea0b15af","id": "test-example-id","createtime": "2019-12-06 18:01:34"}

表 9 在PUT上传对象API中,通过请求参数x-obs-callback携带回调策略

请求 说明
PUT /example.txt?x-obs-callback=eyJjYWxsYmFja0JvZHkiOiAie1wib2JqZWN0TmFtZVwiOiBcIiQoa2V5KVwiLCBcImJ1Y2tldFwiOiBcIiQoYnVja2V0KVwiLCBcImV4dFwiOiBcIiQoZXh0KVwiLCBcImV0YWdcIjogXCIkKGV0YWcpXCIsIFwib3ZlcnJpZGVcIjogXCIkKG92ZXJyaWRlKVwiLCBcInNpemVcIjogXCIkKHNpemUpXCJ9IiwgImNhbGxiYWNrVXJsIjogImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY2FsbGJhY2sifQ== HTTP/1.1User-Agent: curl/7.29.0Host: examplebucket.obs.cn-north-4.myhuaweicloud.comAccept: /Date: WED, 14 Oct 2020 04:11:15 GMTAuthorization: OBS H4IPJX0TQTHTHEBQQCEC:gYqplLq30dEX7GMi2qFWyjdFsyw=Content-Length: 1024Expect: 100-continue[1024 Byte data content] 其中回调策略JSON字符串为:{"callbackBody": "{"objectName": "$(key)", "bucket": "$(bucket)", "ext": "$(ext)", "etag": "$(etag)", "override": "$(override)", "size": "$(size)"}", "callbackUrl": "http://www.example.com/callback"}在回调策略中包含了callbackUrl和callbackBody两个回调参数,该回调策略JSON字符串经过BASE64编码之后即为:eyJjYWxsYmFja0JvZHkiOiAie1wib2JqZWN0TmFtZVwiOiBcIiQoa2V5KVwiLCBcImJ1Y2tldFwiOiBcIiQoYnVja2V0KVwiLCBcImV4dFwiOiBcIiQoZXh0KVwiLCBcImV0YWdcIjogXCIkKGV0YWcpXCIsIFwib3ZlcnJpZGVcIjogXCIkKG92ZXJyaWRlKVwiLCBcInNpemVcIjogXCIkKHNpemUpXCJ9IiwgImNhbGxiYWNrVXJsIjogImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY2FsbGJhY2sifQ==最后通过请求参数x-obs-callback携带。如果该桶中不存在对象名为example.txt的对象,则最终回调消息体是:{"objectName":"example.txt","bucket":"examplebucket","ext":"txt","etag":"f447b20a7fcbf53a5d5be013ea0b15af","override":"false","size":"1024"}

表 10 在PUT上传对象API中,通过头域x-obs-callback携带回调策略

请求 说明
PUT /example.txt? HTTP/1.1User-Agent: curl/7.29.0Host: examplebucket.obs.cn-north-4.myhuaweicloud.comAccept: /Date: WED, 14 Oct 2020 04:11:15 GMTAuthorization: OBS H4IPJX0TQTHTHEBQQCEC:gYqplLq30dEX7GMi2qFWyjdFsyw=x-obs-callback: eyJjYWxsYmFja0JvZHkiOiAia2V5PSQoa2V5KSZvdmVycmlkZT0kKG92ZXJyaWRlKSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhbGxiYWNrMTtodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhbGxiYWNrMiJ9Content-Length: 1024Expect: 100-continue[1024 Byte data content] 其中回调策略JSON字符串为:{"callbackBody": "key=$(key)&override=$(override)", "callbackUrl": "http://www.example.com/callback1;http://www.example.com/callback2"}在回调策略中包含了callbackUrl和callbackBody两个回调参数,该回调策略JSON字符串经过BASE64编码之后即为:eyJjYWxsYmFja0JvZHkiOiAia2V5PSQoa2V5KSZvdmVycmlkZT0kKG92ZXJyaWRlKSIsICJjYWxsYmFja1VybCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhbGxiYWNrMTtodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhbGxiYWNrMiJ9最后通过头域x-obs-callback携带。如果example.txt对象名在该桶中已经存在,那么最终回调消息体为:key=example.txt&override=true

表 11 在合并段API中,通过头域x-obs-callback携带回调策略

请求 说明
POST /example.txt?uploadId=00000163D46218698DF407362295674C HTTP/1.1User-Agent: curl/7.29.0Host: examplebucket.obs.cn-north-4.myhuaweicloud.comAccept: */*Date: WED, 14 Oct 2020 04:11:15 GMTAuthorization: OBS H4IPJX0TQTHTHEBQQCEC:dOfK9iILcKxo58tRp3fWeDoYzKA=x-obs-callback: eyJjYWxsYmFja0JvZHkiOiAie1wiaGFzaFwiOiBcIiQoZXRhZylcIiwgXCJrZXlcIjogXCIkKGtleSlcIn0iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYWxsYmFjayJ9Content-Length: 4221a54357aff0632cce46d942af68356b3820c78aef83f66abc1fa1e8477f296d3943acbd18db4cc2f85cedef654fccc4a4d8 其中回调策略JSON字符串为:{"callbackBody": "{"hash": "$(etag)", "key": "$(key)"}", "callbackUrl": "http://www.example.com/callback"}在回调策略中包含了callbackUrl和callbackBody两个回调参数,该回调策略JSON字符串经过BASE64编码之后即为:eyJjYWxsYmFja0JvZHkiOiAie1wiaGFzaFwiOiBcIiQoZXRhZylcIiwgXCJrZXlcIjogXCIkKGtleSlcIn0iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYWxsYmFjayJ9最后通过头域x-obs-callback携带。最终回调消息体为:{"hash":"aa2a0304e377796ad5f9793f237f22a1-3","key":"example.txt"}

表 12 在合并段API中,通过请求参数x-obs-callback携带回调策略

请求 说明
POST /example.txt?uploadId=00000163D46218698DF407362295674C&x-obs-callback=eyJjYWxsYmFja0JvZHkiOiAib3ZlcnJpZGU9JChvdmVycmlkZSkmZnNpemU9JChmc2l6ZSkiLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYWxsYmFjazE7aHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYWxsYmFjMjtodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhbGxiYWNrMyJ9 HTTP/1.1User-Agent: curl/7.29.0Host: examplebucket.obs.cn-north-4.myhuaweicloud.comAccept: */*Date: WED, 14 Oct 2020 04:11:15 GMTAuthorization: OBS H4IPJX0TQTHTHEBQQCEC:dOfK9iILcKxo58tRp3fWeDoYzKA=Content-Length: 4221a54357aff0632cce46d942af68356b3820c78aef83f66abc1fa1e8477f296d3943acbd18db4cc2f85cedef654fccc4a4d8 其中回调策略JSON字符串为:{"callbackBody": "override=$(override)&fsize=$(fsize)", "callbackUrl": "http://www.example.com/callback1;http://www.example.com/callbac2;http://www.example.com/callback3"}在回调策略中包含了callbackUrl和callbackBody两个回调参数,callbackUrl指定了3个,callbackBody中使用了魔法变量$(override)以及$(fsize)。该回调策略JSON字符串经过BASE64编码之后即为:eyJjYWxsYmFja0JvZHkiOiAib3ZlcnJpZGU9JChvdmVycmlkZSkmZnNpemU9JChmc2l6ZSkiLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYWxsYmFjazE7aHR0cDovL3d3dy5leGFtcGxlLmNvbS9jYWxsYmFjMjtodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NhbGxiYWNrMyJ9最后通过请求参数x-obs-callback携带。如果该桶中已经存在名为example.txt的对象,那么最终回调消息体为:override=true&fsize=104858