来自节点URL请求的无效字符(非UTF-8),但从浏览器中有效



我在node js中使用请求来调用Google Place API Web服务。请求的正文给出了错误Invalid request. One of the input parameters contains a non-UTF-8 string.,因为我在URL参数(keyword参数)中使用高棉字符。

nearByUrl = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=11.55082623,104.93225202&radius=400&keyword=ស្ថានីយប្រេង&key=' + MY_KEY;
request({
    url: nearByUrl,
    json: true
  }, function (error, response, body) {
    console.log(JSON.stringify(body, null, 2));
})

但是,当调用Chrome浏览器的高棉字符完全相同的URL时,我可以获得有效的JSON。

这个问题与请求有关吗?

我该如何修复?

因此,如果要输入要在Chrome和Open开发工具中发送请求的URL,您将看到发送请求的原始URL看起来与此相似:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=11.55082623,104.93225202&radius=400&keyword=%E1%9E%9F%E1%9F%92%E1%9E%90%E1%9E%B6%E1%9E%93%E1%9E%B8%E1%9E%99%E1%9E%94%E1%9F%92%E1%9E%9A%E1%9F%81%E1%9E%84

基本上,Chrome将所有查询参数编码到ASCII,当您直接输入到URL的参数时,查询参数不会编码。但是,如果您通过qs对象将参数发送到request库,则库将为您编码它们,并且您不会从问题中遇到问题。

var request = require("request")
var option = {
  uri: 'https://maps.googleapis.com/maps/api/place/nearbysearch/json',
  qs: {
    location: '11.55082623,104.93225202',
    radius: 1000,
    keyword: 'ស្ថានីយប្រេង',
    key: MY_KEY
  }
};
request(
    option, function (error, response, body) {
    console.log(JSON.stringify(body, null, 2));
})

您可以使用像这样的JS库中构建的方法,但我个人认为第一个方法是更好的解决方案:

nearByUrl = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=11.55082623,104.93225202&radius=400&keyword=' + encodeURIComponent(escape('ស្ថានីយប្រេង')) + '&key=' + MY_KEY;
request({
    url: nearByUrl,
    json: true
  }, function (error, response, body) {
    console.log(JSON.stringify(body, null, 2));
})

为什么我认为使用qs参数的第一个解决方案是更好的解决方案,因为库是为您执行的,并且所有参数均已编码。

可以在此处找到第二种方法的更好解释。

希望这是您问题的解决方案:)