Benjamin Netter
Benjamin Netter

Reputation: 1551

Google Translate API always returning "Required parameter: q" as error

I've been using Google Translate API for a while now, without any problems. I recently pushed my app to my new server and even if it has been working perfectly on my local server, the same source code always gives me the "Required parameter: q" as error message.

I'm using NodeJS + ExpressJS + Request to send this request. Here's my test case:

  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")
    }
  });

Running on my local machine gives me "everything works fine", and running it on my server gives me "something went wrong". Digging more into it, I get the error message mentioned above. As you can see, I'm trying to translate in one request two sentences. It's just a test case, but I really need to use this through POST request instead of doing two GET request.

I have no idea what this is happening, and I double checked my Google settings and I can't find something wrong there. Also, I'm having no problem using Google Places APi with this same api key on my server.

I'm stuck. Anyone has any idea what's wrong here?

Upvotes: 2

Views: 2327

Answers (3)

Zaptree
Zaptree

Reputation: 3803

This answer is a little late but to help people out there with this problem. The problem comes from the way the querystring module converts array parameters:

https://github.com/visionmedia/node-querystring

Its function qs.stringify converts fieldnames (q in the given example) that have an array value to the format:

q[0]=..q[1]=...

This is not a bug but an intended functionality. To overcome this problem without reverting to an old version of the request module you need to manually create your post by using the body option instead of the form option. Also you will need to manually add the content-type header with this method:

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")
    }
});

Obviously this is not as clean but you can easily create a utility function that creates the body string from the object the way you want it to.

Upvotes: 3

Benjamin Netter
Benjamin Netter

Reputation: 1551

Well I finally found what was wrong: the new version of RequestJS doesn't work as the old one and my server was running 2.16 when my local machine was running 2.14.

The difference is the way the array is sent. I debugged and the old version was sending

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

When the new version is sending

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

So I just added 2.14.x instead of 2.x in my package.json file for now, hopefully it will get fixed soon — or maybe it's not a bug? I don't know.

Upvotes: 3

miturbe
miturbe

Reputation: 713

things that pop into my head:

  • jquery file version on server and local PC are not the same
  • file encoding issues (UTF8 on PC ascii on server?)
  • have you tried testing it with chrome with Developer Tools open, then check "Network Tab" and verify exactly what is being sent to Google.

For me at least, when it works on one machine and not the other, it is usually due to the first 2 options.

Good Luck!

Upvotes: 0

Related Questions