问题描述
回调参数callback-var
解析与callbackBody赋值出错。
问题原因
您发送的请求中存在用于上传回调的Callback参数和callback-var
参数,但是解析callback-var
中提供的用户变量,并为Callback参数中的callbackBody赋值时出现错误,导致接口报错。
callbackBody指的是发起回调时请求body的值,例如key=${object}&etag=${etag}&my_var=${x:my_var}
,支持OSS系统变量、自定义变量和常量。其中自定义变量的支持方式在PutObject和CompleteMultipart中是通过callback-var
来传递,在PostObject中则是将各个变量通过表单域来传递。比如上面例子中my_var=${x:my_var}
指的就是用callback-var
中的自定义变量x:my_var
填充callbackBody中的my_var。
问题示例
比如您的请求中callback-var
参数解码后如下所示:
{
"x:var1":"value1",
"x:var2":"value2"
}
同时请求中Callback参数解码后如下所示:
{
"callbackUrl":"https://oss-calllback.com/index.html",
"callbackBody":"size=${size}&my_var=$x:my_var}"
}
上面的Callback参数的callbackBody字段中,第二个键值对my_var=$x:my_var}
有误,因为$
符号后面少了一个{
符号,因此会导致接口报错。
解决方案
请确保请求中callback-var
参数是经过Base64编码的合法的JSON字符串,而且其中每一项都是字符串映射到字符串的键值对;并确保Callback参数中的callbackBody字段格式正确无误。您可以参考Callback文档构造请求。此外,您可以通过请求返回的ErrorMessage得到错误原因,比如上面的例子会得到如下的错误信息:
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>Left brace must be adjacent to dollar sign.</Message>
<RequestId>63F2302A7CF84230346C6D0D</RequestId>
<HostId>dinary.oss-cn-hangzhou.aliyuncs.com</HostId>
<ArgumentName>ReplaceKeyPrefix</ArgumentName>
<ArgumentValue>size=${size}&my_var=$x:my_var}</ArgumentValue>
<EC>0007-00000105</EC>
</Error>
其中Message字段说明$
符号后面应该紧跟着一个{
,您可以根据此类错误信息进行调整。
相关文档
关于上传回调中的常见错误及错误排查,请参见上传回调错误及排除。
关于基于Post Policy的使用规则在服务端通过各语言SDK代码完成签名,并且设置上传回调,然后通过表单直传数据到OSS的具体操作,请参见服务端签名直传并设置上传回调概述。
关于搭建基于OSS的移动应用数据直传服务并设置上传回调的具体操作,请参见快速搭建移动应用上传回调服务。