The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          ET請求和POST請求有什么區別?GET請求的參數在URL的問號后面顯示,而POST參數不在URL上;POST可以比GET請求更大的數據…一般的回答都是這樣。

          但是作為一個高端大氣上檔次的程序員,這樣回答就弱爆了。

          為了搞清楚GET和POST的區別,下面寫了一個Java程序來接收HTTP請求。

          HTTP是基于TCP協議的,所以可以使用Java最底層的Socket實現。下面的程序僅僅不到10行代碼,舍去了異常處理、資源關閉的代碼。當然,不要在意這些細節。

           

          1. public static void main(String[] args) throws IOException {  
          2.     // 服務器監聽端口號8081  
          3.     ServerSocket serverSocket = new ServerSocket(8081);  
          4.   
          5.     // 等待接收請求,這是一個阻塞的方法,當請求到來的時候才會繼續向下執行  
          6.     Socket socket = serverSocket.accept();  
          7.   
          8.     // 獲取請求內容  
          9.     InputStream is = socket.getInputStream();  
          10.     InputStreamReader reader = new InputStreamReader(is);  
          11.   
          12.     // 輸出請求內容  
          13.     while (true) {  
          14.         System.out.print((char)reader.read());  
          15.     }  
          16. }  

          HTTP服務器寫好了,下面是客戶端。瀏覽器就是HTTP客戶端,不用自己去實現了,只需要寫HTML就行。

           

           

          1. <form method="get" action="http://localhost:8081">  
          2.     name:<input type="text" name="name" /><br>  
          3.     age:<input type="text" name="age" /><br>  
          4.     <input type="submit" />  
          5. </form>  

          GET請求:

           

          設置form的method="get",啟動Java程序,用瀏覽器打開HTML輸入。


          提交后看Java程序輸出:

          GET /?name=XXG&age=23 HTTP/1.1
          Host: localhost:8081
          Connection: keep-alive
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
          User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
          Accept-Encoding: gzip,deflate,sdch
          Accept-Language: zh-CN,zh;q=0.8


          POST請求:

          設置form的method="post",啟動Java程序,用瀏覽器打開HTML輸入提交。

          Java程序輸出:

          POST / HTTP/1.1
          Host: localhost:8081
          Connection: keep-alive
          Content-Length: 15
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
          Origin: null
          User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
          Content-Type: application/x-www-form-urlencoded
          Accept-Encoding: gzip,deflate,sdch
          Accept-Language: zh-CN,zh;q=0.8

          name=XXG&age=23


          兩個實驗可以看出,GET和POST參數所在請求數據中的位置不同,這才是GET和POST最基本的區別。

          這里科普一下HTTP協議,HTTP請求一般包含三個部分:

          Request-Line
          Header
          <空行>
          Message-Body[GET請求不包含Message-Body]


          其中Request-Line,就是請求的第一行,例如上面兩個請求:

          GET /?name=XXG&age=23 HTTP/1.1
          POST / HTTP/1.1

          它由三部分組成,請求Method(GET/POST/其他)、Request-URI、HTTP-Version,三個部分中間空格隔開。

          Header就是傳說中的請求頭,鍵值對的形式,每一條占一行。使用不同瀏覽器這部分的內容也不同。

          Message-Body是請求主體,POST請求參數就在這一部分,它與Header之間必須要用空行隔開,這樣服務器才能分清楚Header和Body。Message-Body的長度就是Header中的Content-Length。一般GET請求中是沒有這一部分的。

          上面POST請求中的參數就是Message-Body:

          name=XXG&age=23


          所以,如果再有人問GET請求和POST請求的區別,可以回答:

          GET請求的參數在URL中,在請求的第一行Request-Line中,而POST請求的參數在請求主體Message-Body中。

          是不是碉堡了,大家感受一下。

          posted on 2013-11-29 09:46 Eric_jiang 閱讀(335) 評論(0)  編輯  收藏 所屬分類: tomcat
          主站蜘蛛池模板: 绥德县| 淮北市| 县级市| 磐安县| 鄂伦春自治旗| 天全县| 碌曲县| 乌兰察布市| 嵊州市| 仙桃市| 塔城市| 五原县| 沈丘县| 宜州市| 新田县| 松桃| 泸定县| 家居| 依兰县| 呼伦贝尔市| 辽源市| 巴中市| 松阳县| 宁武县| 墨竹工卡县| 仁寿县| 定远县| 南溪县| 镇赉县| 卫辉市| 鹿泉市| 庐江县| 十堰市| 德钦县| 额敏县| 霍林郭勒市| 崇义县| 永嘉县| 勃利县| 阿拉善左旗| 吉安市|