我发布的请求时accept
标题为"application/json, text/javascript, */*; q=0.01"
但是,尽管有这个标题,但响应总是转到HTML而不是默认值。我在这里错过了什么吗?由于标题不是HTML,因此响应应选择默认值,因为它是唯一的其他选项。
我的代码如下:
res.format({
html: () => {
res.status(jsonRes.code).send(jsonRes.msg)
},
default: () => {
res.status(jsonRes.code).send(jsonRes)
}
})
找到一个解决方案,但这并不能解决我对所发生的事情的误解,所以我不会将其作为答案发布。这会在给定相同标题的情况下成功发送JSON格式的响应。
res.format({
html: () => {
res.status(jsonRes.code).send(jsonRes.msg)
},
json: () => {
res.status(jsonRes.code).send(jsonRes)
},
default: () => {
res.status(jsonRes.code).send(jsonRes)
}
})
答案 0 :(得分:0)
澄清你的编辑工作原因,以及为什么你真的应该用默认的406回答:
Accept HTTP-header字段不仅告诉了一种可接受的格式,而且还有很多。它还通过订购这些产品来说明更优先的产品。
从你的例子中,客户端说的是这样的:我想要json(application/json
),如果你没有,请给我javascript(text/javascript
),或给我任何东西你可以给我(*/*
),但偏好级别很低(;q=0.01
)。
您的服务器现在会解析此请求,并提供无法提供application/json
或text/javascript
的解决方案,但可以使用*/*
来实现html
(因为html
也是*/*
,更具体而不是什么,或者我们无法接受的事情。
Accept字段更像是客户端和服务器之间的协商,如果没有来自快递方的解决方案就可以实现默认情况。
default
参数是回答客户端,例如只能解析YAML(接受设置为text/vnd.yaml, text/x-yaml, text/yaml, application/x-yaml
,但否 */*
),以告诉客户端他们认为没有可用的YAML,你应该回答“406 - 不接受”的情况......(也许你还记录了某人想要的yaml而你没有给他们)。