【问题标题】:Apps Script - UrlFetchApp.fetch {url, method: "GET"} to a gzip gets failed with code 406Apps 脚本 - UrlFetchApp.fetch {url, method: "GET"} 到 gzip 失败,代码为 406
【发布时间】:2022-03-31 11:05:43
【问题描述】:

我在这里进行了数月的任务。任何帮助将非常感激!

我正在尝试使用 UrlFetchApp.fetch() 通过 App Store Connect 上的 API 进行连接。在沙漠中努力生成正确的 JWT 以在 GAS 上进行身份验证后,我现在面临严峻的现实:服务器答案(内容类型和内容编码)不是 JSON,而是 GZIP。

代码 406 消息: “截断的服务器响应:此请求不支持提供的 Accept 标头。请求:application/json 允许:application/a-gzip”

有没有办法仍然可以访问该文件?

这里是只做调用的部分代码(用于认证的JWT签名代码在上面->“sJWT”)

var url = "https://api.appstoreconnect.apple.com/v1/financeReports?filter[regionCode]=ZZ&filter[reportDate]=2019-11&filter[reportType]=FINANCIAL&filter[vendorNumber]=xxx"

var response = UrlFetchApp.fetch(url, { method : "GET", headers : { "Authorization" : "Bearer "+sJWT }});

非常感谢!

【问题讨论】:

    标签: google-apps-script fetch


    【解决方案1】:

    这个答案怎么样?请认为这只是几个可能的答案之一。

    修改点:

    • 当我看到the official document时,要求在请求头中使用application/a-gzip代替Accept
    • 此外,在这种情况下,响应返回 gzip 的内容。所以需要对内容进行解压。

    当以上几点反映到你的脚本中时,下面的修改怎么样?

    修改后的脚本:

    var url = "https://api.appstoreconnect.apple.com/v1/financeReports?filter[regionCode]=ZZ&filter[reportDate]=2019-11&filter[reportType]=FINANCIAL&filter[vendorNumber]=xxx"
    var response = UrlFetchApp.fetch(url, {
      method: "GET",
      headers: {
        "Authorization": "Bearer " + sJWT,
        "Accept": "application/a-gzip"  // Added
      }
    });
    var res = Utilities.ungzip(response.getBlob());  // Added
    

    注意:

    • 以上修改的脚本假设您的 URL 和 sJWT 的值对于使用 API 是正确的。

    参考资料:

    很遗憾,我无法测试上面的脚本。我为此道歉。因此,如果上述修改后的脚本没有解决您的问题,我深表歉意。

    【讨论】:

    • 您好 Tanaike,感谢您提供的所有这些详细信息……我很高兴阅读您的回答!您在标头中使用 "Accept": "application/a-gzip" 是对的,没有更多代码 406。但解压缩步骤出现错误:var res = Utilities. ungzip(response.getBlob()); 我尝试使用以下命令下载文件(不解压缩):DriveApp.createFile(response); 我可以看到该文件没有最后没有任何扩展名。会不会是问题?
    • 我也尝试通过 Postman 下载文件,但是这次当我点击“保存响应”时,文件正确地具有扩展名 .txt.gz
    • @Dimitri Leroux 感谢您的回复。我认为从您的回复中发现脚本有效。所以不会发生错误。我认为可以实现下载。如果您想使用DriveApp.createFile(response);直接保存响应文件,请修改为DriveApp.createFile(response.getBlob());。如果要给出文件名,请使用DriveApp.createFile(response.getBlob().setName("sample.txt.gz"));
    • @Dimitri Leroux 对于您的问题有什么可以做的吗?如果我的回答对您的情况没有用。我必须道歉并修改它。如果您能合作解决您的问题,我很高兴。我想考虑一下解决方案。
    【解决方案2】:

    尝试将 blob 内容类型更改为“application/x-gzip”:

    var url = "https://api.appstoreconnect.apple.com/v1/financeReports?filter[regionCode]=ZZ&filter[reportDate]=2019-11&filter[reportType]=FINANCIAL&filter[vendorNumber]=xxx"
    var response = UrlFetchApp.fetch(url, {
      method: "GET",
      headers: {
        "Authorization": "Bearer " + sJWT,
        "Accept": "application/a-gzip"
      }
    });
    var res = Utilities.ungzip(response.getBlob().setContentType("application/x-gzip"));  // Changed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多