1. 程式人生 > >HTTP請求非同步和同步的區別

HTTP請求非同步和同步的區別

請求方式,分為GET與POST: 
GET 
最為常見的HTTP請求,普通上網瀏覽頁面就是GET。GET方式的引數請求直接跟在URL後,以問號開始。(JS中用 window.location.search獲得)。引數可以用encodeURIComponent進行編碼,使用方式: 
var EnParam = encodeURIComponent(param);
URL只支援大約2K的長度,即2048字元數;使用GET進行AJAX請求時候會快取導致出現的頁面不是正確的,一般方法加random引數值;ajax.send(null)。 

POST 
向伺服器提交資料用到。 
需要將form表單中的值先取出轉換成字串,用&符號連線,(同GET傳引數一樣);提交資料量2GB ;使用ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'),處理提交的字串;ajax.send(strings),這個 strings表示form中需要提交的內容,例如a=1&b=2類似這樣的字串。 

同步與非同步: 
舉個例子:普通B/S模式(同步)AJAX技術(非同步) 
同步:提交請求->等待伺服器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事 
非同步: 請求通過事件觸發->伺服器處理(這是瀏覽器仍然可以作其他事情)->處理完畢 

ajax.open方法中,第3個引數是設同步或者非同步。prototype等js類庫一般都預設為非同步,即設為true。先說下同步的情況 下,js會等待請求返回,獲取status。不需要onreadystatechange事件處理函式。而非同步則需要 onreadystatechange事件處理,且值為4再正確處理下面的內容。 

//同步傳輸模式 
function RequestByGet(nProducttemp,nCountrytemp) 

    var xmlhttp 

    if (window.XMLHttpRequest) 
    { 
         //isIE   =   false; 
         xmlhttp   =   new   XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) 
    { 
         //isIE   =   true; 
         xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP"); 
    } 
                
    //Web page location. 
    var URL="http://www.baidu.com/; 
    xmlhttp.open("GET",URL, false); 
    //xmlhttp.SetRequestHeader("Content-Type","text/html; charset=Shift_JIS") 
    xmlhttp.send(null); 
    var result = xmlhttp.status; 
  
    //OK 
    if(result==200) 
    { 
        document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText; 
    } 
    xmlhttp = null; 



//非同步傳輸模式 
var xmlhttp 
function RequestByGet(nProducttemp,nCountrytemp) 

    if (window.XMLHttpRequest) 
    { 
         //isIE   =   false; 
         xmlhttp   =   new   XMLHttpRequest(); 
    } 
    else if (window.ActiveXObject) 
    { 
         //isIE   =   true; 
         xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP"); 
    } 
                
    //Web page location. 
    var URL="http://www.baidu.com/"; 
    xmlhttp.open("GET",URL, true); 
    xmlhttp.onreadystatechange = handleResponse; 
    //xmlhttp.SetRequestHeader("Content-Type","text/html; charset=UTF-8") 
    xmlhttp.send(null); 


function handleResponse() 

    if(xmlhttp.readyState == 4 && xmlhttp.status==200) 
    { 
        document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText; 
        xmlhttp = null; 
    } 

同步執行模式: 
所謂同步執行模式,是指語句在同步執行模式下,將始終保持對程式流的控制,直至 程式結束。如查詢操作,客戶機上的應用程式在向伺服器發出查詢操作的指令後,將 一直等待伺服器將查詢結果返回客戶機端,然後才繼續進行下一步操作。 
眾所周知,應用程式要從一個大表中刪除所有的記錄將是非常耗時的,如果應用程式 採用的是單執行緒(thread)同步執行方式,某次刪除工作很可能耽誤其他重要工作的完 成。如果應用程式等待的是遠端任務,那麼遠端伺服器失敗或網路故障或一些無法預 知的情況都可能使應用程式無限期地等下去,這是同步執行最大的缺陷。 
但是同步執行模式可以簡化程式編制的複雜性。程式設計師可以不用過多地瞭解比較複雜 的ODBC 2.0 API 的使用,而只需使用 ODBC 的同步執行模式或使用資料控制項和資料庫物件變數來編寫應用程式,可以提高開發效率,但程式執行速度比不上非同步執行 模式的速度。 

非同步執行模式: 
所謂非同步執行模式,是指語句在非同步執行模式下,各語句執行結 束的順序與語句執行開始的順序並不一定相同。例如 查詢操作,客戶機上的應用程式在向伺服器發出了查 詢操作的指令後,將立刻執行查詢語句指令的下一條 語句,而不需要等到伺服器將查詢結果返回客戶機端。 非同步執行方式使應用程式能擺 脫單個任務的牽制,提高了靈活性和應用程式的執行 效率。但非同步執行模式也存在一些問題,如它增加了 程式設計的複雜性,特別是編寫互用性(interoperable)要求較高 的程式。 
在負荷很重的客戶/伺服器系 統中,適宜採用非同步執行模式。在這種環境下,時間 延遲頻繁且漫長,相比之下非同步執行的開銷微不足 道。但是,如果應用執行的環境比較複雜,則必須建 立一套完整的機制,週期性地檢查函式執行的狀態, 以決定下一步執行方案。進行週期的檢查可以有多種方法,如在 應用中設定計時器並處理WM_TIMER資訊等。 
雖然使用非同步執行模式在程式設計 序時十分複雜,但可以實現多工並行執行,使執行的效率大大提高。 
選擇並設定執行模式 在應用程式開發中選擇同步模式還是非同步模式,是一個比 較複雜的層次。當查詢或對資料庫的修改相對簡單時,同步執行模式是一種 很好的選擇,它能夠在幾秒 或更少的時間內返回結果資料。另外,在應用程式獲 得結果集前不能繼續執行時,根本不必要使用非同步執 行模式。在複雜查詢情況下,特別是複雜的多行資料 庫的UPDATE 或DELETE 操作,可能需要很長的時間才能完成, 需採用非同步執行模式,讓使用者可以同時對程式的其他 部分進行操作。 
對於一般程式設計師來說,如果他對同步執行模式與非同步執行模式不瞭解, 他往往會在對伺服器發出一個操作語句(查詢或讀取一條記錄等 操作)後,立該引用伺服器返回的執行結果,或者對該 結果進行下一步操作,這是很危險的。因為,在非同步 執行模式下,客戶機上的後續語句是在該操作語句發 出後接著執行的,但由於各種原因,伺服器不一定能 執行完該操作語句,並在後續語句執行前將結果返回 客戶機。因此,後續語句在引用前一操作語句的執行 結果時,往往會因為該執行結果並不存在而引用了錯 誤的值,造成系統錯誤或死鎖,所以在實際應用中應 根據具體情況慎重選擇執行模式。    

相關推薦

HTTP請求非同步同步區別

請求方式,分為GET與POST:  GET  最為常見的HTTP請求,普通上網瀏覽頁面就是GET。GET方式的引數請求直接跟在URL後,以問號開始。(JS中用 window.location.search獲得)。引數可以用encodeURIComponent進行編碼,使用方式:  var EnParam =

js學習總結----ajax中的http請求方式及同步編程異步編程

功能 依然 interval 需要 發送請求 console dom 屬於 相關 一、請求方式 var xhr = createXHR(); xhr.open("get","/getList?num=12",true); xhr.open("post","/getList

Http 請求 GETPOST的區別

瀏覽器 pos 因此 header 區別 數據 服務 ref 需要 GET和POST還有一個重大區別,簡單的說: GET產生一個TCP數據包;POST產生兩個TCP數據包。 長的說: 對於GET方式的請求,瀏覽器會把http header和data一並發送出去,服務器響應2

HTTP請求getpost的區別優缺點

首先,最一般和大家都知道的區別。 (1)post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中)  (2)post傳送的資料更大(get有url長度限制)  (3)post能傳送更多的資料型別(get只能傳送ASCII字元)  (

HTTP請求 getpost的區別

基本的區別: 1.get 資料附在url 上(以?分隔url和資料,用&連線引數其中引數是空格,轉換為+,如果是中文/其他字元,則直接把字串用BASE64加密,如%E4%BD%A0%E5%A5%BD), post 資料包裹在http包的包體裡。 2.理論上url長度沒有限

HTTP請求報文HTTP響應報文 GETPost的區別

HTTP報文是面向文字的,報文中的每一個欄位都是一些ASCII碼串,各個欄位的長度是不確定的。HTTP有兩類報文:請求報文和響應報文。 HTTP請求報文 一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求資料4個部分組成,下圖給出了請求報文的一般格式。 or <

淺析HTTP中POSTGET區別並用Python模擬其響應請求

    最近在幾周在做手遊崩潰資訊收集和上傳,拿到崩潰資訊後,使用的是HTTP的POST方法上傳到公司共用的伺服器的,因此做簡單總結。本文首先簡單介紹了HTTP協議,主要說明了POST方法和GET方法的區別;然後用Python實現了 對POST方法和GET方法的響應;最後用

淺談ajax非同步同步載入的區別

說簡單點,ajax預設是非同步載入的,也就是說第一個fun請求資料時,資料還未返回時便開始執行第二個fun了, 如果將其設定為同步請求,則會等第一個function執行完後才會載入第二個function了 非同步請求: var flag=true; $.ajax({ u

HTTP請求響應頭

.cn 訪問 htm ref 頁面 格式 技術分享 -s charset 這篇文章簡單總結一下HTTP請求頭和響應頭,並舉一些web開發中響應頭的用例。 1. HTTP請求頭 accept:瀏覽器通過這個頭告訴服務器,它所支持的數據類型。如:text/html,

HTTP請求報文響應報文

狀態碼 技術分享 http ima cto con 例如 消息 char 請求報文 請求報文包含請求行、請求頭部、請求正文,還有空行。 請求行 由請求方法、URL和協議版本組成。 請求方法包括:GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE 協

http 請求報文應答報文

網絡請求報文 POST /cgi-bin/httpconn HTTP/1.1 POST:請求地址 Host: 111.161.64.121 HOST:主機頭 Accept: / Accept :accept 屬性 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; W

http請求響應頭詳細解釋

pad 使用 after 網絡資源 max OS lai 通信 緩存 想對http請求頭和響應頭有更細致的了解,請看如下 Requests部分 Header解釋示例 Accept 指定客戶端能夠接收的內容類型 Accept: text/plain, text/html

HTTP請求格式HTTP響應格式

uri private req upn 6.0 cti sts jpg set HTTP請求格式 "GET {} HTTP/1.1\r\nhost: {}\r\nConnection\r\n\r\n".format(path, host) Request H

執行緒,程序,協程,非同步同步,非阻塞IO

1.執行緒,程序,協程 程序定義:程序是具有一定獨立功能的程式在一個數據集上的一次動態執行的過程,是系統進行資源分配和排程的一個獨立單位 執行緒定義:執行緒是CPU排程和分派的基本單位,是比程序更小能獨立執行的單位,執行緒佔有系統。但是它可以與它同屬的程序和其他在該程序中的執行緒共享

JavaScript非同步同步載入中setTimeout時間執行問題

setTimeout( function(){ alert("1"); },5000) function A(){ //兩種情況: //第一種,A函式是同步載入,載入資料需要10s //第二種,A函式是非同步載入,載入資料需要10s } this.A();

Wireshark的HTTP請求響應包如何對應

以Wireshark2.6.3版本為例,如下圖所示,紅框中的803是一次HTTP的GET請求包,綠框中的809、810兩條記錄都是響應包,究竟哪個是803的響應包呢?接下來介紹三種方式識別; 通過傳輸控制協議資訊識別 如下圖,點選803這條記錄後,在下面的

http請求方式狀態碼的含義

8種請求方式 1、OPTIONS 返回伺服器針對特定資源所支援的HTTP請求方法,也可以利用向web伺服器傳送‘*’的請求來測試伺服器的功能性 2、HEAD 向伺服器索與GET請求相一致的響應,只不過

非同步同步

同步和非同步的區別是什麼?分別舉一個同步和非同步的例子 同步會阻塞程式碼執行,而非同步不會 alert 是同步,setTimeout 是非同步 一個關於 setTimeout 的筆試題 //1,3,5,2,4 console.log(1) setTimeout(function() { con

服務端Http請求Requestresponse原理解析篇(1)

什麼是servlet? .Sun(oracle)公司制定的一種用來擴充套件Web伺服器功能的元件規範. 元件:在軟體開發行業,符合一定規範,實現部分功能,並且需要部署到容器中才能執行的軟體模組 容器:符合一定規範,提供元件執行環境的一個程式 什麼是HTTP協議? Hype

http請求putPatch

http請求常見的get/post我就不多說了,我就來說說今天看到的另外兩中http請求方式put/Patch put/patch 兩者都和POST方法相同,都是用於對伺服器端的資訊進行更新 put:指定需要更新的資源的URI本身,對其內容進行覆蓋 patch:更新資源的