为什么 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
的外部主机通信时,有一些工具可供您使用。
这对 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。接下来,深入了解为什么会这样。
我们可以使用 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);
}
}
我正在尝试通过表格中的 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
的外部主机通信时,有一些工具可供您使用。
这对
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。接下来,深入了解为什么会这样。
我们可以使用
上放置一个断点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);
}
}