2013-06-13 271 views
0

当我做一个Ajax调用服务器的整个页面不回发时,只有少量的数据传递到服务器并返回响应页面。服务器如何知道请求是同步还是异步?

但我想知道处理。服务器或服务器代码如何知道正常调用或Ajax调用中的请求。

我向专家请求,请澄清我的疑问。

在此先感谢。

+0

A *请求*不会是同步或异步的,这只是一个问题, sed要发送的请求将在发送请求后释放线程。 – Quentin

+0

浏览器知道什么触发了一个请求,因为它们是软件,并且被编程为跟踪这些事情(因为如果他们没有跟踪哪个请求是出于什么目的,那么除了加载一个单独的对象之外,它们将无法执行任何操作没有外部图像,脚本,样式表等HTML文件) – Quentin

+0

同意你的回应,但仍然是我的问题是当我做ajax调用如何编码或浏览器知道是的,它是Ajax调用? –

回答

2

服务器或服务器代码如何知道正常调用或Ajax调用中的请求。

服务器知道这是否你的JavaScript代码标记为这样的HTTP数据包。例如。 in jQuery the HTTP header sent to the server has an X-Requested-With set and ASP.NET uses this to distinguish if HTTP packets are ajax calls or not

要更多地了解你可以检查无论是在一个数据包嗅探器,如Fiddler或与开发一个浏览器发送的那些HTTP报文。监视流量的工具。在后一种情况下,你可以在例如Chrome浏览器开发工具,通过执行以下操作:

  1. 打开Chrome开发人员工具,Ctrl+Alt+I(或Mac的Cmd+Alt+I)。
  2. 选择网络选项卡(您可能必须刷新页面以启用网络监控)
  3. 执行Ajax调用时,所做的HTTP请求应显示在底部的列表中。
  4. 选择相关数据包,您现在应该看到所选数据包的“标题”,“预览”,“响应”,“Cookies”和“定时”选项卡。
  5. 选择“标题”选项卡
  6. 您可能必须展开Request Headers部分。其中标题应为X-Requested-With: XMLHttpRequest

这里是工具的截屏看包,因为我在编这个答案:

Chrome Dev Tools inspecting a request while editing this answer

需要注意的是AJAX调用不一定必须是异步因为它们可以是同步的(阻塞javascript直到响应被加载)。有时需要同步呼叫,例如弹出窗口阻止程序不允许您在异步ajax回调中打开浏览器窗口。

0

AJAX调用与XmlHttpRequest原型的实例执行。其.open()方法的第三个参数是async:bool。所以 xhr.open("GET", "http://example.com", true) 是异步和 xhr.open("GET", "http://example.com")是同步。 jQuery的get()post()ajax()是默认异步,你需要通过异步PARAM使其同步。所以回答你的问题:你告诉浏览器你想要什么请求。

1

服务器或服务器代码如何知道在正常呼叫或Ajax的请求是否调用

事实并非如此。Ajax发送的HTTP请求与任何其他HTTP请求都不相同。

发出请求可以做一些事情,使其可识别(例如,通过添加一个查询字符串,通过改变Accept头的东西更适合于上下文(如Accept: application/json)或通过添加额外的HTTP标头中的代码(一些库添加X-Requested-With: XMLHttpRequest

这些都不是保证,因为有人总是可以手动发出HTTP请求。它们可以很好地确定在您的应用程序中返回哪个视图,但是如果您尝试实现任何类型的安全性