Express.js是否遵守RFC-3986的查询字符串?

时间:2019-05-09 09:01:18

标签: node.js express query-string querystringparameter

ExpressJ在解码查询字符串参数时是否尊重/使用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 wich不允许使用诸如è,é,à...这样的字符。

所以Express似乎拒绝了这些字符,但是如果我们尝试

请求

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

期望的日志

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

服务器日志

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

因此直接的字符“è”被接受,但是编码版本%E8不被接受吗?

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

1 个答案:

答案 0 :(得分:1)

基本上可以自我解决:

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

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