我一直在使用谷歌翻译API一段时间,没有任何问题。 我最近将我的应用程序推送到我的新服务器,即使它在我的本地服务器上运行完美,相同的源代码总是给我“必需参数:q”作为错误消息。
我正在使用NodeJS + ExpressJS + Request发送此请求。这是我的测试用例:
var request = require('request');
request.post({
url: "https://www.googleapis.com/language/translate/v2",
headers: {"X-HTTP-Method-Override": "GET"},
form: {
key: /* My Google API server key */,
target: "en",
q: ["Mon premier essai", "Mon second essai"]
}
}, function(error, response, data) {
if (!error && response.statusCode == 200) {
console.log("everything works fine");
} else {
console.log("something went wrong")
}
});
在我的本地计算机上运行会让我“一切正常”,在我的服务器上运行它会让我“出错”。进一步深入研究,我得到上面提到的错误信息。 正如你所看到的,我试图在一个请求中翻译两句话。这只是一个测试用例,但我确实需要通过POST请求使用它而不是做两个GET请求。
我不知道发生了什么,我仔细检查了我的Google设置,我找不到有什么问题。 此外,我在使用Google Places APi在我的服务器上使用相同的api密钥时也没有问题。
我被困住了。任何人都知道这里有什么问题吗?
答案 0 :(得分:3)
好吧,我终于发现了什么问题: RequestJS 的新版本不能用作旧版本,当我的本地机器运行2.14时,我的服务器运行2.16。
不同之处在于数组的发送方式。我调试了,旧版本正在发送
键= my_api_key&安培;目标= EN&安培; Q =周一%20premier%20essai&安培; Q =周一%20秒%20essai
新版本发送时
键= my_api_key&安培;目标= EN&安培; Q [0] =星期一%20premier%20essai&安培; Q [1] =星期一%20秒%20essai
所以我刚刚在package.json文件中添加了2.14.x而不是2.x,希望它很快就会修复 - 或者它可能不是bug?我不知道。
答案 1 :(得分:3)
这个答案有点晚,但要帮助那些有这个问题的人。问题来自querystring模块转换数组参数的方式:
https://github.com/visionmedia/node-querystring
它的函数qs.stringify将具有数组值的字段名(在给定示例中为q)转换为以下格式:
Q [0] = .. Q [1] = ...
这不是错误,而是预期的功能。要在不恢复旧版本的请求模块的情况下解决此问题,您需要使用body选项而不是form选项手动创建帖子。此外,您还需要使用此方法手动添加内容类型标头:
var request = require('request');
request.request({
url: "https://www.googleapis.com/language/translate/v2",
headers: {
"X-HTTP-Method-Override": "GET",
'content-type':'application/x-www-form-urlencoded; charset=utf-8'
},
body:'key=xxxx&target=en&q=q=Mon%20premier%20essai&q=Mon%20second%20essai'
}, function(error, response, data) {
if (!error && response.statusCode == 200) {
console.log("everything works fine");
} else {
console.log("something went wrong")
}
});
显然这不是很干净,但你可以轻松创建一个实用程序函数,以你想要的方式从对象创建正文字符串。
答案 2 :(得分:0)
至少对我来说,当它在一台机器而不是另一台机器上工作时,通常是由于前两个选项。
祝你好运!