处理快速路由参数中的UTF8字符

时间:2018-04-01 14:40:40

标签: node.js express utf-8 parameters

我遇到使用express创建的NodeJS REST api的问题。 我有两个电话,一个get和一个帖子设置如下:

router.get('/:id', (request, response) => {
    console.log(request.params.id);
});
router.post('/:id', (request, response) => {
    console.log(request.params.id);
});

现在,我希望ID能够包含特殊字符(UTF8)。 问题是,当我使用邮递员来测试请求时,看起来它们的编码方式非常不同:

GET http://localhost:3000/api/â输出â

POST http://localhost:3000/api/â输出â

有谁知道我在这里缺少什么? 我必须提一下,帖子调用还包含文件上传,因此内容类型将为multipart/form-data

3 个答案:

答案 0 :(得分:1)

您应该在客户端对您的URL进行编码并在服务器上对其进行解码。请参阅以下文章:

对于JavaScript,encodeURI可能派上用场。

答案 1 :(得分:0)

Does anyone have any idea what I am missing here?

是的,它没有输出â,它会输出â,但无论你在检查结果的时候,都认为你正在阅读别的东西(iso-8859-1也许?) ,而不是UTF-8,并将其呈现为â

最有可能的是,您在Web浏览器中查看结果,并且Web服务器发送了错误的Content-Type标头。尝试header("Content-type: text/plain;charset=utf-8");header("Content-type: text/html;charset=utf-8");,然后您的浏览器应该正确呈现您的â

答案 2 :(得分:0)

似乎邮递员使用UTF-8编码,但没有正确的url编码。因此,您在请求url框中键入的内容将与您在浏览器中键入该URL的内容有所不同。

我正在请求:GET localhost/ä,但它在网上将其编码为localhost/ä (这现在是无效的URL,因为它包含非ASCII字符)

但是当我在Google chrome中输入localhost/ä时,它会将请求正确编码为localhost/%C3%A4

因此,您可以尝试将请求的网址手动编码为http://localhost:3000/api/%C3%A2

我认为这是一个错误(也许是回归)。我正在MacOS上使用最新版本的PostMan v7.11.0。