【问题标题】:Google Translate API always returning "Required parameter: q" as errorGoogle Translate API 总是返回“必需参数:q”作为错误
【发布时间】:2013-04-08 23:35:54
【问题描述】:

我已经使用 Google Translate 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 设置,但没有发现哪里有问题。 此外,在我的服务器上使用具有相同 api 密钥的 Google Places APi 也没有问题。

我被困住了。有人知道这里出了什么问题吗?

【问题讨论】:

  • 我想不出原因,但我建议您执行以下操作:创建一个将记录所有请求和请求参数的服务器。更改您的代码以调用该服务器而不是 googleapis。在本地机器和生产环境上运行它。由于谷歌基本上是说您的请求有问题。如果它们都是相同的请求,则可能存在与 IP 或位置相关的问题。还有一种可能是你的请求太长(可能是编码不同),api说q限制在5k左右。
  • @illniyar 感谢您的帮助,发现问题来自 RequestJS。

标签: node.js google-api google-translate


【解决方案1】:

这个答案有点晚了,但可以帮助人们解决这个问题。问题来自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")
    }
});

显然这不是很干净,但您可以轻松创建一个实用函数,以您希望的方式从对象创建正文字符串。

【讨论】:

  • 谢谢,这行得通。我想知道这是否已修复?因为OP的代码仍然不起作用。
  • @properchels 他们增加了通过qsStringifyOptions 设置数组格式并将选项arrayFormat 设置为repeat 的功能
  • 好,很酷,会试试看。使用客户端库似乎少了很多工作,但这需要大量其他凭据。感谢您的回复,干杯!
【解决方案2】:

好吧,我终于找到了问题所在:新版本的 RequestJS 不能像旧版本一样运行,而我的本地机器运行的是 2.14,而我的服务器运行的是 2.16。

区别在于数组的发送方式。我调试了,老版本正在发送

key=my_api_key&target=en&q=Mon%20premier%20essai&q=Mon%20second%20essai

新版本发送时

key=my_api_key&target=en&q[0]=Mon%20premier%20essai&q[1]=Mon%20second%20essai

所以我现在只是在我的 package.json 文件中添加了 2.14.x 而不是 2.x,希望它会很快得到修复 - 或者它可能不是错误?我不知道。

【讨论】:

    【解决方案3】:

    突然出现在我脑海中的事情:

    • 服务器和本地PC上的jquery文件版本不一样
    • 文件编码问题(服务器上的 PC ascii 上的 UTF8?)
    • 您是否尝试在打开开发者工具的情况下使用 chrome 对其进行测试,然后检查“网络选项卡”并准确验证发送给 Google 的内容。

    至少对我来说,当它在一台机器上而不是另一台机器上工作时,通常是由于前两个选项。

    祝你好运!

    【讨论】:

    • 嘿!感谢您的帮助,发现问题显然出在 RequestJS 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2012-01-02
    • 1970-01-01
    • 2022-01-07
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多