1

我希望我的 node.js 服务器根据请求的内容类型发送不同的内容,我的服务器代码是这样的

    if(req.accepts('text/html')){
        console.log("accepts('text/html')");
        locals.page = 'posts';                  
        res.render('question.ejs', locals.questions);
    }
    else if(req.accepts('application/json')){   
        console.log("'application/json'");          
        res.json(200,locals.questions);
    }

有一个类似的帖子,但仅适用 于 node.js express 中的 android 客户端,如何在内容协商上判断 HTTP 请求是 application/json 还是 html

这是我的 Jquery 代码

$.ajax({ type: "GET", url: "/course/abc/questions", contentType:"application/json; charset=utf-8", dataType:"json", success: function(data){ 控制台.log(data.length,data); } });

出于某种原因,即使我在 appication/json 上设置了内容类型,node.js 服务器端仍然接受 html 而不是 json。

有点奇怪

4

2 回答 2

2

GET 请求 (jquery) 与响应 (express) 的标头不同。在请求/浏览器/jquery/ajax 端,当发出 GET 请求时,您设置Accept标头,意思是“我想取回其中一种格式”。没有Content-Type标头,因为 GET 请求没有正文,因此该标头不适用。

在服务器端,您设置Content-Type,表示“此响应正文具有以下格式”。accept 的语义可以是替代格式的列表,而 content-type 只是一个值。

这是从这个答案复制的片段

$.ajax({
    headers: { 
        Accept : "application/json; charset=utf-8"
    },
    success : function(response) {
        ...
    }
})
于 2013-08-23T20:36:12.373 回答
1

可能值得重新审视您的标题字段定义......

我质疑您是否真的应该根据Content-Type标题返回内容类型。

TLDR;

  • Accept- 请求者用来指定响应可接受的媒体类型
  • Content-Type- 指示请求者发送给接收者的媒体类型

所以我的第一个建议 - 为工作使用正确的工具,Accept在请求中发送标头。

现在,您可以使用req.acceptsexpress 功能,该功能旨在满足您的需求(即询问客户他们喜欢哪种数据格式)。

例如

const accept = req.accepts(['html', 'json'])
if (accept === 'html') {
    // res.send(...)
} else if (accept === 'json') {
    // res.json(...)
} else {
    // send 406 Not acceptable
}
于 2019-01-22T05:23:25.777 回答