【问题标题】:Does Express.js respect RFC-3986 for query string?Express.js 是否尊重 RFC-3986 的查询字符串?
【发布时间】:2019-09-27 01:53:12
【问题描述】:

在解码查询字符串参数时,ExpressJs 是否尊重/使用 RFC-3986 标准? 为什么直接字符“è”被接受而编码版本“%E8”不被接受?

测试 Expressjs http 服务器

'use strict';

const express = require('express');
const bodyParser = require('body-parser');

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

app.get('/test?', (req, res, next) => {
  console.log(req.query);
  res.status(200);
});

app.listen(4567, '127.0.0.1', () => {
    console.log('test http server started');
});

请求

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+%E8+bar

预期日志

{ message: 'lorem ipsum, foo è bar' }

服务器日志

{ message: 'lorem+ipsum%2C%20foo+%E8+bar' }

如果我们删除 %E8 字符“è”

请求

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+bar

服务器日志

{ message: 'lorem ipsum, foo bar' }

这里 (https://www.url-encode-decode.com/) 我可以读到,对于 URI,它可以应用 RFC-3986,它不允许像 è、é、à...这样的字符。

所以看起来 Express 拒绝这些字符,但如果我们尝试

请求

GET localhost:4567/test?message=lorem+ipsum%2C%20foo+è+bar

预期日志

{ message: 'lorem+ipsum%2C%20foo+è+bar' }

服务器日志

{ message: 'lorem ipsum, foo è bar' }

所以直接字符“è”被接受但编码版本 %E8 不是?

我尝试阅读 ExpressJS 源代码,但找不到响应。

【问题讨论】:

    标签: node.js express query-string querystringparameter


    【解决方案1】:

    基本上自己解决了:

    首先我发现在 UTF-8 中,“è”的十六进制是“C3A8”而不是“E8”。

    所以 Express 可能接受所有 UTF-8 字符,而不应用 RFC-3986 标准。这将解释为什么不接受 'E8' 而直接 char 'è' 是。 'E8' 不被接受,因为它与 UTF-8 中的任何内容都不匹配。

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2010-10-25
      • 2019-08-31
      • 2014-12-05
      相关资源
      最近更新 更多