4

我正在尝试通过表格中的 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());


}
4

1 回答 1

5

在调试与 的外部主机通信时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. 我们可以fetch使用 来检查选项和参数getRequest()。在现有调用的正上方添加这一行fetch(),并在fetch().

    var test = UrlFetchApp.getRequest(url, options);
    

    在调试器中启动函数,当断点被命中时,仔细检查其中的内容test

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

    检查其余选项,我们看到contentTypeis not 'application/json'

    调试器视图

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

继续进行,直到您确定并修复了任何其他错误。

另一个技巧是用来encodeURIComponent()转义参数中的受限字符fetch,而不是手动编码它们。它简化了您的代码,因为您可以编写“真实”字符,#而不是 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);
  }

}
于 2015-08-27T15:25:39.090 回答