Разница между запросом AJAX и обычным запросом браузера - PullRequest
31 голосов
/ 31 декабря 2011

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

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

Ответы [ 7 ]

29 голосов
/ 31 декабря 2011

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

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

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

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

24 голосов
/ 31 декабря 2011

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:/7792025/raznitsa-mezhdu-zaprosom-ajax-i-obychnym-zaprosom-brauzera
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

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

0 голосов
/ 11 июня 2019

Я всегда проверяю, является ли "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.

0 голосов
/ 15 февраля 2019

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

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

ASP.NET MVC 5:

HttpRequestBase.IsAjaxRequest()

Django:

HttpRequest.is_ajax()

Колба:

flask.Request.is_xhr

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

0 голосов
/ 10 января 2013

Хотя я верю вам, ребята, в weblogic есть нечто совершенно странное: Я пишу приложение, используя ExtJS Framework, который выполняет 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.

0 голосов
/ 31 декабря 2011

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

0 голосов
/ 31 декабря 2011

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

$_SERVER['HTTP_X_REQUESTED_WITH']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...