使用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_URL为STS服务端地址,authCredentialsProvider使用STS服务URL进行初始化。
  2. 然后查看SDK中OSSAuthCredentialsProvider类,对于STS服务端的请求的ststoken信息和处理方式,从而可以查看到对于请求STS服务端获取Token的JSON数据中需要有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值。

适用于

  • 对象存储OSS