Я хотел бы проверить, является ли тип, запрашиваемый моим клиентом, JSON или HTML, так как я хочу, чтобы мой маршрут удовлетворял как человеческим, так и машинным требованиям.
Я прочитал документацию Express 3 по адресу:
И есть два метода req.accepts()
и req.is()
, которые используются следующим образом:
req.accepts('json')
или
req.accepts('html')
Поскольку они не работают должным образом, я попытался использовать:
var requestType = req.get('content-type');
или
var requestType = req.get('content-type');
requestType
всегда undefined
...
Используя предложение в этой теме:
тоже не работает. Что я делаю не так?
Изменить 1. Я проверил правильное согласование 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
Решение (спасибо Брет):
Оказывается, я неправильно указывал заголовки 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, который использует jQuery Ajax-вызовы под ним). Параметры, переданные в вызов 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"
}
}
}
})