NodeJS:验证请求类型(检查JSON或HTML)
我想检查我的客户请求的类型是JSON还是HTML,因为我希望自己的路线能够同时满足人和机器的需求。
我在以下位置阅读了Express 3文档:
http://expressjs.com/api.html
有两种方法req.accepts()
和req.is()
,使用方法如下:
req.accepts('json')
要么
req.accepts('html')
由于这些无法正常工作,因此我尝试使用:
var requestType = req.get('content-type');
要么
var requestType = req.get('Content-Type');
requestType
总是undefined
…
也不起作用。我究竟做错了什么?
:我已经检查了正确的客户端HTML协商。这是我的两个不同的请求标头(来自调试器检查器):
HTML:
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
JSON:
Accept: application/json, text/javascript, */*; q=0.01
(感谢Bret):
原来我指定的Accept标头错误,这*/*
就是问题所在。这是有效的代码!
//server (now works)var acceptsHTML = req.accepts('html');
var acceptsJSON = req.accepts('json');
if(acceptsHTML) //will be null if the client does not accept html
{}
我正在使用JSTREE,这是一个在下面使用jQuery Ajax调用的jQuery插件。传递给Ajax调用的参数位于“ ajax”字段中,而我已将“accepts”参数替换为完整的“headers”对象。现在它可以工作了,如果使用纯jQuery,应该可以解决该问题。
//client.jstree({
// List of active plugins
"plugins" : [
"themes","json_data","ui","crrm","cookies","dnd","search","types","hotkeys","contextmenu"
],
"json_data" : {
"ajax" : {
// the URL to fetch the data
"url" : function(n) {
var url = n.attr ? IDMapper.convertIdToPath(n.attr("id")) : "<%= locals.request.protocol + "://" + locals.request.get('host') + locals.request.url %>";
return url;
},
headers : {
Accept : "application/json; charset=utf-8",
"Content-Type": "application/json; charset=utf-8"
}
}
}
})
回答:
var requestType = req.get('Content-Type');
如果在请求中实际指定了内容类型,则绝对有效(我刚刚在几分钟前对此进行了重新验证)。如果未定义内容类型,则它将是未定义的。请记住,通常只有POST和PUT请求会指定内容类型。其他请求(例如GET)通常会指定接受类型的列表,但这显然不是同一回事。
编辑:
好吧,我现在更好地理解了你的问题。您在谈论的是Accept:标头,而不是内容类型。
这是正在发生的事情:请注意*/*;q=0.8
列出的接受类型末尾的?本质上说“我会接受任何东西”。因此,req.accepts('json')
总是会返回,"json"
因为从技术上讲,它是一种可接受的内容类型。
我认为您想要的是查看是否application/json
已明确列出,如果是,则以json响应,否则以html响应。这可以通过以下两种方法完成:
// a normal loop could also be used in place of array.some()if(req.accepted.some(function(type) {return type.value === 'application/json';}){
//respond json
} else {
//respond in html
}
或使用简单的正则表达式:
if(/application\/json;/.test(req.get('accept'))) { //respond json
} else {
//respond in html
}
以上是 NodeJS:验证请求类型(检查JSON或HTML) 的全部内容, 来源链接: utcz.com/qa/424828.html