HTTP協議報文、工作原理及Java中的HTTP通信技術詳解


一、web及網絡基礎

      1、HTTP的歷史
           1.1、HTTP的概念:
                HTTP(Hyper Text Transfer Protocol,超文本傳輸協議)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。
                它是一個應用層協議,承載於TCP之上。由請求和響應構成,是一個標准的客戶端服務器模型
           1.2、HTTP的發展歷史:
                作為Web文檔傳輸協議的HTTP,它的版本更新十分緩慢,目前只更新了三個版本:
                HTTP/0.9:  1990年,並未建立標准
                HTTP/1.0:  1996年5月,
                HTTP/1.1:  1997年1月,目前主流的HTTP版本
           1.2、HTTP在Web應用中的重要性:
                HTTP協議是整個Web基礎,許多應用都離不開對HTTP協議的認識:
                WebService = HTTP + XML
                Reset = HTTP + JSON
                各種API的實現:HTTP + XML/JSON
                采集、小偷站
                QQ、迅雷等桌面應用軟件
      2、網絡基礎TCP/IP協議
            2.1、協議的概念:
                 協議是指計算機通信網絡中,兩台計算機進行通信,所必須遵循的規定或規則。
                 計算機網絡中有各種各樣的協議,比如TCP協議、IP協議、HTTP協議、FTP協議等等,像這樣把與互聯網相關聯的協議集合起來,就成為TCP/IP協議族
                 
            2.2、TCP/IP的分層管理
                 應用層:負責處理特定的應用程序,如FTP、DNS、HTTP等。
                 傳輸層:對上層應用層提供處於網絡連接中兩台計算機之間的數據連接。該層有兩種協議:TCP和UDP。
                 網絡層:處理網絡上流動的數據報。該層協議有:IP、ICMP、IGMP。
                 數據鏈路層:處理連接網絡的硬件部分。包括操作系統、硬件設備驅動、網卡、光纖等。
            2.3、TCP/IP通信傳輸流程
                 
      3、IP、TCP、DNS與HTTP的密切關系
            3.1、IP協議的概念與作用
                 IP(Internet Protocol),網際協議,位於網絡層
                 把各種數據包傳送給對方。最重要的兩個條件是IP地址和MAC地址(MAC地址基本不會改變,但可以通過軟件改變)
                 ARP地址解析協議:根據IP地址查出MAC地址
            3.2、TCP協議的概念與作用
                 TCP(Transmission Control Protocol),傳輸控制協議,位於傳輸層。
                 提供可靠的字節流服務,通過三次握手策略
            3.3、TCP協議的三次握手過程
                 
            3.4、DNS的概念與作用
                 DNS(Domain Name System),域名解析系統,位於應用層。
                 提供域名到IP地址之間的解析服務
            3.5、HTTP與TCP、IP和DNS的關系
                 HTTP生成請求報文需要通過DNS解析出IP找到服務器,通過TCP傳輸請求。
      4、URI和URL的概念
            4.1、URI的概念:
                 URI(Uniform Resource Identifier),統一資源標識符,是一個用於標識某一互聯網資源名稱的字符串。
            4.2、URL的概念:
                 URL(Uniform Resource Location),統一資源定位符,它描述一台特定服務器上某特定資源的特定位置。
            4.3、URI與URL的關系:
                 URI用字符串標識某一互聯網資源,而URL代表資源的地址,由此可見,URL是URI的子集。
                 URI由兩個主要的子集URL和URN構成
            4.4、URI的格式,由9部分構成              
                   
                  http:協議方案名,獲取資源是要指定協議類型
                user:pass:登錄信息(認證),指定用戶名和密碼,可選。
                  www.example.com:服務器地址
                  80:端口號,可選
                  /home/index.html:文件路徑
                  age=11:參數組件,為應用程序提供訪問資源所需的附加信息
                  查詢字符串:針對已指定的文件路徑內的資源,可以使用查詢字符串穿入任意參數,可選(分頁case)
                  mask:片段標識符,通常可標記出已獲取資源中的子資源(文檔內的某一個位置),可選
 
二、細說HTTP的報文格式和工作流程
      1、HTTP請求報文和響應報文的格式
           1.1、HTTP事務和報文流的概念
                HTTP事務 = 請求命令 + 響應結果
                
           1.2、請求報文的格式(抓包工具,fiddler)
                請求行:   請求方式(大寫)    請求URL    版本
                請求首部: 名: 值
                空行:
                報文主體:
                請求首部也叫消息頭,其中字段名不區分大小寫,習慣駝峰式,字段可按任意順序排列,有些可接受多個值選項,有些字段可出現多次
                1.2.1、請求方式:GET、POST、HEAD、OPTIONS、DELETE、PUT
                                默認發GET請求,如在瀏覽器直接輸入地址訪問,點超鏈接訪問都是get,用戶如想把請求方式改為post,可通過更改表單的提交方式實現。POST與GET方式的區別:傳遞參數的方式;傳遞數據量大小
                1.2.2、常用請求頭:
                       Accept: 瀏覽器可接受的MIME類型  */* (大類型)/(小類型)
                       Accept-Charset:告訴服務器,瀏覽器支持哪種字符集
                       Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip
                       Accept-Language:瀏覽器所希望的語言種類
                       Host:初始URL中的主機和端口
                       Referer:包含一個URL,用戶從該URL代表的頁面發出訪問當前請求的頁面
                       Content-Type:內容類型
                       If-Modified-Since:值為一個GMT標准時間,如果在該時間到目前,請求文件沒有更改,則服務器告訴瀏覽器可以直接從緩存中讀取文件
                       User-Agent:用戶的瀏覽器類型,操作系統等信息
                       Content-Length:表示請求消息正文的長度
                       Connection:如果值為Keep-Alive,表示需要持久連接,HTTP 1.1默認進行持久連接
                       Cookie:這是最重要的請求頭信息之一,但是由於該技術存在安全隱患等原因,該功能被Session取代
                       Date:值為GMT時間,表示請求時間
           1.3、響應報文的格式 
                響應行:   協議版本      狀態碼     原因短語
                響應首部:
                空行:
                報文主體:
                1.3.1、狀態碼:用於表示服務器對請求的各種不同處理結果和狀態,它是一個三位的十進制數。響應狀態碼分為5類:
                       
                1.3.2、常用狀態碼:
                       200:正常
                       301:永久重定向  
                       302/307:臨時重定向
                       304:未修改,可以使用緩存,無需再次修改
                       404:資源找不到
                       500:服務器內部錯誤
                       關於更多狀態碼,請參考博客:http響應狀態碼大全
                1.3.3、常用響應頭:
                       Location:http://cn.bing.com/ 指示新的資源位置
                       Server:apache tomcat 指示服務器的類型
                       Content-Encoding: gzip 服務器發送數據采用的編碼類型
                       Content-Length:80 告訴瀏覽器正文的長度
                       Content-Language:zh-cn 服務器發送的文本的語言
                       Content-Type:text/html;charset=GB2312 服務器發送內容的MIME類型
                       Last-Modified:GMT時間 文件最后修改的時間
                       Refresh:1;url=http://www.baidu.com 指示客戶端刷新頻率,單位是秒
                       Content-Disposition:attachment;filename=aaa.zip 指示客戶端下載文件
                       Set-Cookie:SS=Q0=5Lb_nQ;path=/search 服務器發送的Cookie
                       Expires: GMT時間  表示過期時間,其值為0或-1表示禁止緩存
                       Cache-Control:no-cache(1.1) 表示進制緩存
                       Connection:close/Keep-Alive
                       Date: GMT時間
      2、HTTP的工作流程
            2.1、整個流程步驟
                 
            2.2、域名解析過程
                 
            2.3、三次握手過程
            2.4、發起HTTP請求
            2.5、響應HTTP請求並得到HTML代碼
            2.6、瀏覽器解析HTML代碼
            2.7、瀏覽器對頁面進行渲染呈現給用戶
      3、HTTP1.0與HTTP1.1的區別
            3.1、HTTP1.0的基本運行方式:
                    一個事務分為四個過程:建立連接、瀏覽器發出請求信息、服務器發出響應信息、關閉連接。每次連接只處理一個請求和響應。對每一個文件的訪問,瀏覽器與服務器都要建立一次單獨的連接
            3.2、HTTP1.1的特點
                    在一個TCP連接上可以傳送鎖哥HTTP請求和響應
                    多個請求和響應過程可以重疊
                    增加了更多的請求頭和響應頭,比如Host、If-Unmodified-Since請求頭等
      4、使用Telnet連接的實例
            Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標准協議和主要方式。為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端電腦上使用telnet程序,用它連接到服務器
 
三、Java中的HTTP通信
      1、使用HTTP的Get方式讀取網絡數據
     
class ReadByGet extends Thread{
    @Override
    public void run(){
        URL url = new URL("網址");//如果有參數,在網址中攜帶參數
        URLConnection conn = url.openConnection();
        InputStream is = conn.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        
        String line;
        StringBuilder builder = new StringBuilder();
        while((line=br.readLine())!=null){
              builder.append(line);
        }
        br.close();
        isr.cloae();
        is.close();
        
        System.out.println(builder.toString);
    }
}
public static void main(String[] args){
    new ReadByGet().start();
} 

      2、使用HTTP的Post方式與網絡交互通信  

Class ReadByPost extends Thread{
     @override
     public void run(){
         URL url = new URL("網址");
         HttpURLConnection conn = (HttpURLConnection)url.openConnection();
         conn.addRequestProperty("encoding","UTF-8");
         conn.setDoInput(true);
         Conn.setDoOutput(true);
         conn.setRequestMethod("POST");
         
         OutputStream os = conn.getOutputStream();
         OutputStreamWriter osw = new OutputStreamWriter(os);
         BufferedWriter bw = new BufferedWriter(osw);
          
         bw.write("向服務器傳遞的參數");
         bw.flush();
         
         InputStream is = conn.getInputStream();
         InputStreamReader isr = new InputStreamReader(is);
         BufferedReader br = new BufferedReader(isr);         
         String line;
         StringBuilder builder = new StringBuilder();
         while((line = br.readLine())!=null){
              builder.append(line);
         }
         //關閉資源
         System.out.println(builder.toString);
     }
}
public static void main(){
     new ReadByPost().start();
}

      
      3、使用HttpClient進行Get方式通信

            apache有一個HttpClient包
  1. class Get extends Thread{
       
        HttpClient client = HttpClients.createDefault();
        @Override
        public void run(){
           
             HttpGet get = new HttpGet("http://www.baidu.com");
             
             HttpResponse response = client.execute(get);
             HttpEntity entity = response.getEntity();
             String result = EntityUtils.toString(entity,"UTF-8");
             
             System.out.println(result);
             
        }
    }
    public static void main(String[] args){
        new Get().start();
    }


          4、使用HttpClient進行Post方式通信

 
class Post extends Thread{
    HttpClient cilent = HttpClients.CreateDefault();
    @Override
    public void run(){
        HttpPost post = new HttpPost("網址");
        //設置要傳的參數
        List<BasicNameValuePair> parameters = new ArratList();
        parameters.add(new BasicNameValuePair("key","value"));
        
        post.setEntity(new UrlEncodeFormEntity(parameters,"UTF-8"));
        HttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();
        String result = EntityUtils.roString(entity,"UTF-8");
        
        System.out.println(result);
        
    }
}
main(){
    new Post().start();
}



 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM