AJAX请求和常规浏览器请求之间的区别

时间:2011-12-31 01:53:02

标签: javascript ajax xmlhttprequest

AJAX请求和直接浏览器请求之间是否存在差异(就如何调用和加载网页而言)?

换句话说,我的意思是:是否以与客户端请求(由浏览器发起)不同的方式处理直接服务器端请求?

7 个答案:

答案 0 :(得分:29)

可能存在一些标题差异,但主要行为差异在于客户端。

当浏览器发出window.location.href = "index.html"中的常规请求时,它会清除当前窗口并将服务器响应加载到窗口中。

使用ajax请求,当前窗口/文档不受影响,javascript代码可以检查请求的结果并按照这些结果执行它想要的操作(将HTML动态插入页面,解析JSON并使用页面逻辑,解析XML等...)。

服务器没有做任何不同的事情 - 它只是客户端如何处理来自这两个请求的响应。

答案 1 :(得分:24)

就服务器而言,AJAX请求与“正常”浏览器请求相同,而不是可能略有不同的HTTP标头。例如chrome发送:

X-Requested-With:XMLHttpRequest

我不确定该标头是否标准化,或者是否在每个浏览器中都有所不同,甚至在每个浏览器中都包含


编辑:我把它拿回来,那个标题是由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 :(得分:0)

不是真的。除了大多数Ajax客户端发送X-Requested-With=XMLHttpRequest HTTP标头

答案 3 :(得分:0)

虽然我相信你们,但是在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();

有效!怪异。

答案 4 :(得分:0)

一些流行的客户端库(例如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时,newer versions中不包括该帮助器,并且Flask将其标记为已弃用。

答案 5 :(得分:0)

我总是检查“ text / html”是否是请求的“最佳”接受模仿类型,因为浏览器始终将其作为第一个发送。

Firefox示例:

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

当然,这仍然可能是一个以text / html作为Accept mimetype的ajax请求,但是当您知道哪个客户端将使用您的后端api时,我发现这是可靠的。

答案 6 :(得分:-2)

你的用户代理,也就是浏览器,发送一个XHR标题,你可以从php中捕获这样的标题:

$_SERVER['HTTP_X_REQUESTED_WITH']