使用Android SDK请求OSS资源时出现No value for StatusCode报错

问题描述

在使用阿里云OSS移动端Android SDK请求OSS资源时,返回以下报错。

com.alibaba.sdk.android.oss.ClientException: No value for StatusCode

org.json.JSONException: No value for StatusCode

[ErrorMessage]: No value for StatusCode

org.json.JSONException: No value for StatusCode

问题原因

该报错是Android SDK对于JSON数据解析的错误,错误是在请求STS服务端时,STS服务端返回ststoken信息中参数问题导致发生报错。

解决方法

Android SDK请求OSS资源出现该报错的排查方法如下:

  1. 查看使用OSSAuthCredentialsProvider初始化方式直接访问鉴权应用服务器的代码,检查STS服务端地址是否正常。OSSAuthCredentialsProvider初始化方式请参见初始化

    说明

    STS_INFO_URLSTS服务端地址,authCredentialsProvider使用STS服务URL进行初始化。

  2. 查看SDKOSSAuthCredentialsProvider类,对于STS服务端的请求的ststoken信息和处理方式,从而可以查看到对于请求STS服务端获取TokenJSON数据中需要有StatusCode字段,同时该值需要为200才能判定请求Token通过,否则返回“No value for StatusCode”错误。

  3. 由以上代码可知,使用OSSAuthCredentialsProvider方式的初始化,对于STS服务端返回的JSON数据是有要求的,如下为正确的JSON数据。

    说明

    必须有字段StatusCode,且注意大小写区分。

    {
        "StatusCode":200,
        "AccessKeyId":"STS.NTH8eXffvqKXXXXXXCHMsu",
        "AccessKeySecret":"5rfu1899GJFJKXXXXXXXXXXXoGaTHX6V5BR4PZkNZ5x",
        "Expiration":"2021-08-10T06:57:05Z",
     "SecurityToken":"CAIS0w9XXXXXXXXXB2yfSjIr5f9c9/si7lXxomlNVWA00XXXXXXXXXlzz2IH1EfndpAOkfs/g/nmBU5/gSlqJ4T55XXXXXXzUco0/uc2T1fau5JkXXXXXXX9Umwyta2/SuH9S8ynQpXJQlvYlyh17KLnfDG5JTKMOoGIjpgVPrZyWRKjPwJbGPBcJAZptK1/MmDKZ9KsKQLSi3DMFygYvRFn20p17r6j59CY9hvGhUfm9/cRoI39WLbGCfNhJ5BiSdy48fVrf67aqk5q5gNN6b19gd4Gm3fOtcrPBEJKsVfUcbiY2OBEDyJFUY4TPoMD4N/Wt9BThtvrranZ6iYPH5kMDH6GGNz4mpWVSLrxZo9kT9uhZSSRiOLoH4LurgYpbUgcMA53YNc7Ihdyc0dxGmuEc/b+oQ2WMl3zF/nbgLtV3ZN+z1zu8saHPESf1CVTZ47E1fQagAE1EJun71o0MsRXEO6ZV5yra1zCnTlzwihYnH2NpGVngyDEI1niaqpA50Rch+r+6Ff3CWNzhn/tlzhI5tZjDaS4C6g8zvbc/zDWpxF6gq6QpwaLbDj7vEgbun6AuYy5PuXEZO6+j5Zzvxt333R73gPQN2oqRqaewdStQF3NrCKgYw=="
    }
  4. 使用以下两种方法进行解决。更多信息,请参见快速搭建移动应用直传服务

    • 修改您生成STS的接口代码,返回的JSON中,包含有StatusCode这个字段给Android SDK。

    • 修改您Android SDK的代码,取消对StatusCode的获取,改成返回STS的接口JSON中的Key值。