【问题标题】:Why is Kimono API responding with a 404?为什么 Kimono API 会以 404 响应?
【发布时间】:2015-08-26 15:30:57
【问题描述】:

我正在尝试通过 Google 脚本在表格中更新我的和服 API。表单中有很多 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());


}

【问题讨论】:

    标签: javascript google-apps-script google-sheets kimono


    【解决方案1】:

    在调试与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 参数中的受限字符,而不是手动编码它们。它简化了您的代码,因为您可以编写像 # 这样的“真实”字符,而不是像 %23 这样的 UTF-8 转义序列。

    更新代码:

    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);
      }
    
    }
    

    【讨论】:

    • 哇,这是一个非常周到且经过充分研究的答案。
    • 感谢@ShotgunNinja!类似的问题不断出现,所以我想是时候有人解释如何解决这些问题了。我也决定把它变成一篇博文。
    • 哈,估计 FIRST Robotics 的相关人员会写出这样的问题。 #1652 和 #2970 明矾!
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2020-05-19
    • 2020-05-11
    • 1970-01-01
    • 2017-09-10
    • 2013-06-02
    • 2020-05-21
    • 2021-03-20
    相关资源
    最近更新 更多