2013-06-13 270 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請求。它們可以很好地確定在您的應用程序中返回哪個視圖,但是如果您嘗試實現任何類型的安全性