使用Google Apps脚本中的CloudKit Web Services API查询CloudKit公共数据库时的AUTHENTICATION_FAILED

时间:2016-04-20 22:15:42

标签: google-apps-script cloudkit cloudkit-web-services

我正在尝试使用CloudKit Web服务API从Google Apps脚本中的生产CloudKit容器的公共数据库中提取文章记录。

我的请求基于this page上的文档。

这是我的代码:

// variables for the CloudKit request URL
var path = "https://api.apple-cloudkit.com";
var version = "1";
var container = "iCloud.com.companyname.My-Container-Name";
var environment = "production";
var database = "public";

var token = "8888888888888_my_actual_token_88888888888888888"

function showArticles() {

  // assemble the URL
  var url = path + "/database/" + version + "/" + container + "/" + environment + "/" + database + "/records/query?ckAPIToken=" + token;

  // specify the record type to query
  var query = {
    recordType: "Article"
  };

  // specify the payload for the POST request
  var payload = {
    query : query
  };

  // set up the fetch options for the fetch request
  var options = {
    method : "POST",
    payload : payload
   };

  // make the request
  var response = UrlFetchApp.fetch(url, options);

  Logger.log(response);
}

UrlFetchApp.fetch(url, options)因此错误而失败:

Request failed for https://api.apple-cloudkit.com/database/1/iCloud.<?>-Container-Name/development/public/records/query?ckAPIToken=8888888888888_my_actual_token_88888888888888888 returned code 401. Truncated server response: {"uuid":"7d8a8547-ad08-4090-b4b3-917868a42f6f","serverErrorCode":"AUTHENTICATION_FAILED","reason":"no auth method found"} (use muteHttpExceptions option to examine full response) (line 30, file "Code")

我已经进行了几个小时的故障排除,我无法弄清楚我做错了什么。我在我的开发环境中也尝试了一个单独的令牌,同样的事情发生了。

This page提到了ckWebAuthToken参数并说“如果省略并且必需,则请求失败”,但我找不到任何说明请求ckWebAuthToken的内容。我假设我不需要ckWebAuthToken,因为我尝试访问的记录在我的容器的公共数据库中,我收到AUTHENTICATION_FAILED错误而不是AUTHENTICATION_REQUIRED错误

令我困惑的一个部分是出现在错误消息中的URL:

https://api.apple-cloudkit.com/database/1/iCloud.<?>-Container-Name/development/public/records/query?ckAPIToken=8888888888888_my_actual_token_88888888888888888

我希望它是:

https://api.apple-cloudkit.com/database/1/iCloud.com.companyname.My-Container-Name/development/public/records/query?ckAPIToken=8888888888888_my_actual_token_88888888888888888

但是我不知道这是否真的是被请求的URL,当我记录url变量时,一切看起来都很好。

提前感谢任何疑难解答提示或解决方案!

更新

我尝试使用Postman,请求使用相同的端点和POST数据。看起来网址的container组件已被Google Apps脚本UrlFetchApp.fetch()方法损坏。 <?>似乎只会在网址中显示com.时显示。

1 个答案:

答案 0 :(得分:0)

我不确定为什么这是答案,但我能够使用JSON.stringify() payload options上的var options = { method : "POST", payload : JSON.stringify(payload) }; 来解决问题:

A::B