我试图通过Google脚本更新我的和服API。工作表中有许多urls,但我只为这个示例显示了2个urls。
我正在接收HTTP错误404。我查过了,所有的钥匙和身份证都没问题。
我怎么才能确定到底出了什么问题?
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());
}发布于 2015-08-27 15:25:39
在使用UrlFetchApp调试外部主机通信时,您可以使用以下几种工具。
muteHttpExceptions,以便您可以查看它们。(实际上,您可以编写自己的代码来处理它们,只有throw可以处理您不希望看到的异常。)
这是通过将'muteHttpExceptions' : true添加到fetch参数来完成的。
如果异常是静音的,fetch不会抛出异常,而是会在HTTPResponse中传递失败响应代码。在那里,您可以提取响应代码和内容文本以进行调试(或自动处理)。
像这样修改代码,以记录错误:
var response = UrlFetchApp.fetch(url,options);var rc = response.getResponseCode();if (rc !== 200) { // HTTP错误Logger.log("Response (%s) %s",rc,response.getContentText( );//可以自己抛出异常,如果适当的话)。
快跑,下面是我们看到的:
15-08-27 11:18:06:688 EDT响应(404.0) {“错误”:true,"message":“未能找到API”}
一些API提供非常丰富的错误消息。这个,没那么多。但是它确实告诉我们,我们的URL是正确的,但是服务找不到我们想要的API。接下来,探究一下为什么会这样。fetch检查getRequest()选项和参数。将这一行添加到现有fetch()调用的上方,并在fetch()上放置一个断点。
var test = UrlFetchApp.getRequest(url,options);
在调试器中启动函数,当命中断点时,仔细检查test的内容。
一个常见的问题是POST有效载荷的编码。您手动编码#到%23,并使用JSON.stringify(),所以没有问题。
检查剩下的选项,我们发现contentType不是'application/json'。
现在,您查看您的代码,发现contentType的名称是错误类型的content-Type。删除连字符,然后再试一次。
一直往前走,直到你发现并修复了其他的bug。
另一个技巧是使用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);
}
}https://stackoverflow.com/questions/32230792
复制相似问题