首页 > 解决方案 > 非 UTF-8 字符串错误公共域但不是 lcoalhost

问题描述

我正在使用 GOOGLE API 来获取几何值。

这是我的一段代码:

const utf8 = require('utf8');

apiCreateShop.post('/', function(request, response) {

if (request.query.street && request.query.street_number && request.query.city && request.query.country && request.query.name && request.query.vendorID && request.query.description) {
        
        var url = utf8.encode('https://maps.googleapis.com/maps/api/geocode/json?address=' + request.query.street + ' ' + request.query.street_number + ' ' + request.query.city + ' ' + request.query.country + '&key=key');
        
        var lat = "";
        var lng = "";
        http.get(url, (res) => {
            let body = "";
            res.on("data", (chunk) => {
                body += chunk;
            });
            res.on("end", () => {
                try {
                    let json = JSON.parse(body);
                    lat = json['results'][0].geometry.location['lat'];
                    lng = json['results'][0].geometry.location['lng'];

如果我使用 POSTMAN 将 API 调用到我的本地开发环境,我会成功。

在此处输入图像描述

将代码部署到我的测试实例(域),我失败了,得到以下错误:

error_message: '无效请求。输入参数之一包含非 UTF-8 字符串。',

在此处输入图像描述

错误是参数中传递的街道的“Ü”。

{ "message": "No data found" } //异常返回

我试过

utf8.encode(字符串)

但它不工作。这里有什么问题?

标签: node.jsutf-8

解决方案


如此处所示,URL 无效。RFC 3986定义了每个组件中允许使用的字符。在查询组件中,只允许以下内容:

  query       = *( pchar / "/" / "?" )
  pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
  unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
  pct-encoded = "%" HEXDIG HEXDIG
  sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

基本上,说“拉丁语、0-9 和一些符号”的方式很长。Ü不在那个名单上。URL 不是 UTF-8 编码的。它们采用 US-ASCII 编码(即“7 位 ASCII”)。

您需要对其他值进行百分比编码。Ü应该如此%C3%9C

不同的组件有不同的规则。

有些服务器对他们接受的内容很草率,所以有时原始的 UTF-8 会“工作”。但它是无效的,并不是所有的服务器都会接受它。


推荐阅读