Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Запрос 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

Возможно, существуют некоторые различия в заголовках, но основная разница в поведении на клиенте.

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

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

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

Ответ 3

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

Ответ 4

Хотя я верю вам, ребята, в weblogic есть нечто совершенно странное: Я пишу приложение с использованием среды ExtJS, которая вызывает AJAX.

Выполняя j_security_check, я всегда получаю ошибки при выполнении AJAX: Weblogic говорит:

unauthorized: var submitButton = new Ext.Button({
            text: 'Logon',
            formBind: true, //only enabled once the form is valid
            disabled: true,
            handler: function() {                
                Ext.Ajax.request({
                    url: "j_security_check",
                    params: {
                        j_username: dlg.getForm().findField('j_username').getValue(),
                        j_password: dlg.getForm().findField('j_password').getValue()
                    },
                    method: "GET"
                });
            }
        });

Это не удается.

Когда я выдаю это:

window.location.href = "j_security_check?j_username=" + dlg.getForm().findField('j_username').getValue() + "&j_password=" + dlg.getForm().findField('j_password').getValue();

Это работает! Weird.

Ответ 5

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

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

ASP.NET MVC 5:

HttpRequestBase.IsAjaxRequest()

Джанго:

HttpRequest.is_ajax()

Настой:

flask.Request.is_xhr

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

Ответ 6

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

Пример Firefox:

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

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

Ответ 7

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

$_SERVER['HTTP_X_REQUESTED_WITH']