Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Разница между запросом AJAX и обычным запросом браузера

Автор вопроса: QqwyОтветов: 6

Есть ли разница между запросом AJAX и прямым запросом браузера (с точки зрения того, как вызывается и загружается веб-страница)?

Другими словами, я имею в виду: обрабатывается ли прямой запрос на стороне сервера каким-либо образом иначе, чем запрос на стороне клиента (инициируемый браузером)?

javascriptxmlhttprequestajax

Ответы

Ответ 1 · рейтинг 35 · Mark Kahn

Запрос AJAX идентичен "обычному" запросу браузера с точки зрения сервера, за исключением потенциально немного отличающихся заголовков HTTP. например хром отправляет:

X-Requested-With:XMLHttpRequest

Я не уверен, является ли этот заголовок стандартизированным или нет, отличается ли он в каждом браузере или даже включен вообще в каждом браузере.


edit: я беру это обратно, этот заголовок отправляется jQuery (и, вероятно, другими библиотеками JS), а не браузером, о чем свидетельствует:

var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();

который отправляет:

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie: ....
Host:stackoverflow.com
If-Modified-Since:Sat, 31 Dec 2011 01:57:24 GMT
Referer:http://stackoverflow.com/questions/8685750/how-does-an-ajax-request-differ-from-a-normal-browser-request/8685758
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11

что приводит меня к выводу, что по умолчанию абсолютно никакой разницы.

Ответ 2 · рейтинг 36 · jfriend00

Могут быть некоторые различия в заголовках, но основное отличие в поведении заключается в клиенте.

Когда браузер делает обычный запрос, как в window.location.href = "index.html", он очищает текущее окно и загружает в него ответ сервера.

При запросе ajax текущее окно/документ не затрагивается, а код javascript может анализировать результаты запроса и делать с этими результатами то, что он хочет (динамически вставлять HTML на страницу, анализировать JSON и использовать его в логике страницы, анализировать XML , и т.д...).

Сервер не делает ничего другого - он просто обрабатывает ответ от двух запросов клиентом.

Ответ 3 · рейтинг 2 · slashCoder

Некоторые популярные клиентские библиотеки, такие как jQuery, включают заголовок X-Requested-With в свои запросы. и установите его на XMLHttpRequest, чтобы пометить их как AJAX.

Кажется, несколько лет назад это считалось достаточно стандартным (вероятно, из-за огромной популярности jQuery и его присутствия почти на каждом веб-сайте), поэтому многие серверные фреймворки даже имеют помощников, которые заботятся о проверке этого заголовка в полученном запросе. для тебя:

ASP.NET MVC 5:

HttpRequestBase.IsAjaxRequest()

Django:

HttpRequest.is_ajax()

Flask:

flask.Request.is_xhr

Однако кажется, что с окончанием господства jQuery во внешнем мире и стандартизацией fetch API и появлением других современных клиентских библиотек, которые по умолчанию не добавляют никаких заголовков для этой цели, шаблон рухнул. в устаревание также в бэкэнде; с ASP.NET MVC, не включая помощника в более новых версиях и Flask помечает его как устаревший.

Ответ 4 · рейтинг 1 · Marcelo Paixão Resende

Я всегда проверяю, является ли "text/html" "лучшим" MIME-типом запроса, потому что браузеры всегда отправляют его первым.

Пример фаерфокса:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Конечно, это все еще может быть ajax-запрос с text/html в качестве MIME-типа Accept, но я считаю, что это надежно, когда вы знаете, какой клиент будет использовать ваш серверный API.

Ответ 5 · Juan Mendes

Не совсем. За исключением того, что большинство клиентов Ajax отправляют HTTP-заголовок X-Requested-With=XMLHttpRequest.

Ответ 6 · рейтинг -2 · Mr. BeatMasta

ваш пользовательский агент, он же браузер, отправляет заголовок XHR, который вы можете поймать из php следующим образом:

$_SERVER['HTTP_X_REQUESTED_WITH']

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы