在使用OSS Android SDK上传回调时报错The callback sni is invalid

问题描述

使用OSS Android SDK进行文件上传并配置服务器回调(Callback)时无法正确设置callbackSNI参数。具体问题如下:

  • OSS Android SDK中定义的callbackSNI参数类型为字符串。

    image

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

    image

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

image

问题原因

JSON 是一种无显式类型的数据交换格式。当 Java 对象被序列化为 JSON 字符串时,原始类型信息(如布尔型、字符串等)在传输过程中丢失。

针对 OSS 回调参数 callbackSNI,服务端要求其值为布尔类型(true 或 false)。因此,在构造回调参数时,必须确保生成的 JSON 中该字段为布尔形式callbackSNI: true,而非字符串形式"callbackSNI": "true"

解决方案

在构造上传回调参数时,确保 callbackSNI 被正确序列化为 JSON 布尔值。请通过以下步骤实现:

  1. 使用 HashMap<String, Object> 构建回调参数。

  2. 将 callbackSNI 设置为 Java 布尔类型 true 或 false

  3. 将 Map 转换为 JSONObject,保证类型正确序列化。

  4. 将 JSON 对象转为字符串后进行 Base64 编码。

  5. 通过 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);