node.js - 非 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(字符串)
但它不工作。这里有什么问题?
解决方案
如此处所示,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 会“工作”。但它是无效的,并不是所有的服务器都会接受它。
推荐阅读
- ruby-on-rails - 为什么 Rails 不更新“has_one”参考?
- java - 在 Java 中使用自定义字体创建按钮会导致按钮具有奇怪的形状
- java - 是什么让 dir 成为 Eclipse 中的项目?
- python - 如何将日志记录“标签”添加到堆栈驱动程序
- c++ - 时间:2018-10-10 标签:c++boostsocketproxy-server add SSL
- node.js - 在 Sequelize 迁移中创建关联
- react-native - React-Native 如何给方法一个变量
- ios - Xcode 项目:是否可以以编程方式确定库的路径?
- mysql - MySQL对两个子集进行排序
- android - 取两个editText的总和并将其放入textView