2015-06-20 3 views
0

Я вижу, что с $.ajax() Я могу использовать свойство dataType, чтобы сообщить jQuery, какой ответ я ожидаю от сервера, обычно json.Определить тип данных HTTP-запроса

Но затем на стороне сервера, как узнать тип данных, который был запрошен?

Я понимаю, что обычно сервер должен знать, что отправить на основе содержимого запроса, но мой вариант использования здесь немного отличается. У меня есть обработчик ошибок, встроенный в PHP, и я хотел бы узнать, в каком формате я выводить информацию об отладке. В случае фатальных/синтаксических ошибок, предупреждений, сценарий может даже не дойти до функции обработчика запроса, связанной с запросом.

Существует заголовок CONTENT_TYPE, но, видимо, он всегда application/x-www-form-urlencoded, и он отправляется только по запросам POST.

И есть заголовок HTTP_ACCEPT, который выглядит как application/json, text/javascript, */*; q=0.01. Нужно ли разбирать эту строку?

+1

Возможно, лучше иметь отдельный параметр запроса, который указывает, какой тип ответа вы должны отправить. Я не думаю, что вы должны правильно зависеть от 'HTTP_ACCEPT', и кто-то может спросить, например. простой текст, но затем нужно проанализировать его как JSON позже. – Xymostech

ответ

1

Нет стандартного способа для клиента рассказать серверу, какой тип данных требуется. Клиенты не говорят «Я хочу текст/простоту» или «только HTML» (это может быть только предполагается из URI). Они только рассказывают, что они могут интерпретировать (HTTP_ACCEPT) и то, что они публикуют (CONTENT_TYPE).

Для вашего сервера обработчика ошибок на стороне, чтобы надежно определить, какой формат вывода для использования, вы можете передать дополнительные заголовки запроса или параметры запроса с вашим запросом, например:

$.ajax({ 
    ... 
    headers: { 
     "X-Expected-Format": "text/plain" 
    } 
    ... 
}); 
+0

Этот заголовок запроса '' Accept' '(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) делает именно это. Если это только содержало «text/plain», то клиент _is_ сообщает серверу, какой тип данных требуется. Сервер должен отвечать «HTTP 406», если он не может вернуть этот тип данных. – SilverlightFox

0

Там нет стандартной конвенции для клиент Ajax, чтобы сообщить серверу, какой формат данных он хочет в ответе.

Обычно для определенного запроса Ajax используется одна из нескольких вещей.

  1. Известно, что запрос генерирует определенный тип ответа (например, только этот ответ и всегда генерирует JSON). Клиент не запрашивает данные определенного типа. Он просто знает, что этот конкретный запрос возвращает JSON.

  2. Запрос имеет конкретный аргумент, посланный с ним, который клиент использует для запроса определенного типа возвращаемых данных (например, XML, HTML, JSON и т. Д.). Это может быть параметр запроса (если это запрос GET).

  3. Путь к вызову Ajax определяет тип запрашиваемого ответа. Например, я видел API, который использует один из сегментов пути в запросе, чтобы определить, должен ли отвечать XML или JSON.

Хотя вариант 2 может быть выполнен с помощью настраиваемого HTTP-заголовка, обычно это не делается с заголовками HTTP. Если какой-либо аргумент отправлен, он обычно отправляется как часть аргументов вызова ajax (однако они отправляются).


dataType вариант, который предлагает JQuery, чтобы сказать библиотеку JQuery точно, какой тип реакции следует ожидать, так что если это JSON, например, он может разобрать JSON для вас.Этот аргумент обычно не требуется, потому что jQuery может обычно указывать, какой тип ответа он основан на заголовках HTTP или на основе выборки самого ответа. Разумеется, нет никакого вреда при указании dataType для запроса Ajax, но он абсолютно должен соответствовать типу данных, возвращаемых сервером, и заданное вами значение dataType не отправляется на сервер каким-либо образом. Это просто инструкция для библиотеки на стороне клиента для того, как она должна обрабатывать ответ, когда он поступит.

Смежные вопросы