为什么Kimono API会响应404?

Łuk*_*ski 4 javascript google-sheets google-apps-script kimono

我正在尝试通过表单中的Google脚本更新我的和服API.表格中有很多网址,但我在这个例子中只显示了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());


}
Run Code Online (Sandbox Code Playgroud)

Mog*_*dad 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
      }
    
    Run Code Online (Sandbox Code Playgroud)

    运行,这是我们看到的:

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

    某些API提供了非常丰富的错误消息.这个,不是那么多.但它确实告诉我们我们的URL正确,但该服务无法找到我们想要的API.接下来,深入研究为什么会如此.

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

    var test = UrlFetchApp.getRequest(url, options);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    检查剩余的选项,我们发现contentType不是'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);
  }

}
Run Code Online (Sandbox Code Playgroud)