为什么 Kimono API 以 404 响应?

Why is Kimono API responding with a 404?

我正在尝试通过表格中的 Google 脚本更新我的 kimono API。 sheet 中有很多 url,但我在这个例子中只显示了 2 个。

我收到 HTTP 错误 404。我已经检查过,apikey 和 id 没问题。

我如何确定真正的问题所在?

function PostParameters2() {

  var parameters = {
    apikey: "--apikey--",
    urls: [
      "https://twitter.com/search?q=%23running",
      "https://twitter.com/search?q=%23swimming"
    ]
  };

  var data = JSON.stringify(parameters);

  var url = 'https://kimonolabs.com/kimonoapis/--apiId--/update';

  var options = {
    'method': 'POST',
    'content-Type': 'application/json',
    'payload': data
  };

  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getResponseCode());


}

调试与 UrlFetchApp 的外部主机通信时,有一些工具可供您使用。

  1. 这对 muteHttpExceptions 有帮助,因此您可以查看它们。 (事实上​​ ,您可以简单地编写自己的代码来处理它们,并且只有 throw 用于您确实不希望出现的异常。)

    这是通过将 'muteHttpExceptions' : true 添加到您的 fetch 参数来完成的。

    在关闭异常的情况下,fetch 不会抛出异常,而是传递 HTTPResponse 中的失败响应代码。从那里,您可以提取响应代码和内容文本以进行调试(或自动处理)。

    像这样修改您的代码,以记录错误:

      var response = UrlFetchApp.fetch(url, options);
      var rc = response.getResponseCode();
      if (rc !== 200) {
        // HTTP Error
        Logger.log("Response (%s) %s",
                   rc,
                   response.getContentText() );
        // Could throw an exception yourself, if appropriate
      }
    

    运行,这是我们看到的:

    [15-08-27 11:18:06:688 EDT] Response (404.0) {
      "error": true,
      "message": "Could not find API"
    }
    

    有些 API 给出了非常丰富的错误信息。这个,没那么多。但它确实告诉我们 URL 是正确的,但服务找不到我们想要的 API。接下来,深入了解为什么会这样。

  2. 我们可以使用 getRequest() 检查 fetch 选项和参数。将此行添加到现有 fetch() 调用的正上方,并在 fetch().

    上放置一个断点
    var test = UrlFetchApp.getRequest(url, options);
    

    在调试器中启动函数,当遇到断点时,仔细检查test的内容。

    一个常见问题是 POST 有效负载的编码。您将 # 手动编码为 %23 并使用了 JSON.stringify(),所以没有问题。

    检查剩余选项,我们发现 contentType 不是 'application/json'

现在您查看您的代码,发现 contentType 的名称被错误输入为 content-Type。删除连字符,然后重试。

继续前进,直到您发现并修复了任何其他错误。

另一个技巧是使用 encodeURIComponent() 转义 fetch 参数中的受限字符,而不是手动编码它们。它简化了您的代码,因为您可以编写 "real" 字符,如 # 而不是它们的 UTF-8 转义序列,如 %23.

更新代码:

function PostParameters2() {

  var parameters = {
    apikey: "--apikey--",
    urls: [
      encodeURIComponent("https://twitter.com/search?q=#running"),
      encodeURIComponent("https://twitter.com/search?q=#swimming")
    ]
  };

  var data = JSON.stringify(parameters);

  var url = 'https://kimonolabs.com/kimonoapis/--apiId--/update';

  var options = {
    'method': 'POST',
    'contentType': 'application/json',
    'payload': data,
    'muteHttpExceptions' : true
  };

  var test = UrlFetchApp.getRequest(url, options);
  var response = UrlFetchApp.fetch(url, options);
  var rc = response.getResponseCode();
  if (rc !== 200) {
    // HTTP Error
    Logger.log("Response (%s) %s",
               rc,
               response.getContentText() );
    // Could throw an exception yourself, if appropriate
  }
  else {
    // Successful POST, handle response normally
    var responseText = response.getContentText();
    Logger.log(responseText);
  }

}