问题描述
使用OSS Android SDK进行文件上传并配置服务器回调(Callback)时无法正确设置callbackSNI参数。具体问题如下:
OSS Android SDK中定义的callbackSNI参数类型为字符串。

在实际的回调逻辑中,该参数的类型为布尔型。

当传入字符串"true "时会报错The callback sni is invalid。

问题原因
JSON 是一种无显式类型的数据交换格式。当 Java 对象被序列化为 JSON 字符串时,原始类型信息(如布尔型、字符串等)在传输过程中丢失。
针对 OSS 回调参数 callbackSNI,服务端要求其值为布尔类型(true 或 false)。因此,在构造回调参数时,必须确保生成的 JSON 中该字段为布尔形式callbackSNI: true,而非字符串形式"callbackSNI": "true"。
解决方案
在构造上传回调参数时,确保 callbackSNI 被正确序列化为 JSON 布尔值。请通过以下步骤实现:
使用
HashMap<String, Object>构建回调参数。将 callbackSNI 设置为 Java 布尔类型
true或false。将 Map 转换为
JSONObject,保证类型正确序列化。将 JSON 对象转为字符串后进行 Base64 编码。
通过
x-oss-callback请求头将编码后的字符串注入上传请求元数据。
示例代码如下:
Map callbackMap = new HashMap<String, Object>() {
{
put("callbackUrl", mCallbackAddress);
//callbackBody可以自定义传入的信息
put("callbackBody", "filename=${object}");
put("callbackSNI", true);
}};
JSONObject jsonObj = new JSONObject(callbackMap);
String callback = Base64.encodeToString(jsonObj.toString().getBytes(), Base64.NO_WRAP);
Log.d("oss", jsonObj.toString());
ObjectMetadata metadata = new ObjectMetadata();
metadata.setHeader("x-oss-callback", callback);
put.setMetadata(metadata);该文章对您有帮助吗?