HTTP協議淺析(中):請求報文和響應報文

來源:互聯網
上載者:User

標籤:map   方法   添加   for   冒號   get   keyword   wow   xaml   

1. 請求報文格式1.1 伺服器測試代碼

伺服器測試代碼:

#include <stdio.h>  #include <stdlib.h>  #include <string.h>                         #include <unistd.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <arpa/inet.h>int main(){     // 建立通訊端點:通訊端    int sockfd = socket(AF_INET, SOCK_STREAM, 0);      if(sockfd < 0)      {          perror("socket");          return -1;      }      // 設定本地地址結構體      struct sockaddr_in my_addr;      bzero(&my_addr, sizeof(my_addr));   // 清空          my_addr.sin_family = AF_INET;       // ipv4      my_addr.sin_port   = htons(8000);   // 連接埠      my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ip      // 綁定      int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));      if( err_log != 0)      {          perror("binding");          close(sockfd);                return -1;      }      err_log = listen(sockfd, 10); // 監聽,監聽通訊端改為被動      if(err_log != 0)      {          perror("listen");          close(sockfd);                return -1;        }         printf("listen client @port=%d...\n", 8000);     int connfd;      connfd = accept(sockfd, NULL, NULL);    // 等待串連      char buf[8*1024] = {0};    read(connfd, buf, sizeof(buf));    printf("%s", buf);    while(1)    {        NULL;    }    return 0;}

瀏覽器輸入url地址:

終端啟動伺服器程式,測試http的請求報文:

1.2 請求報文格式說明

HTTP 要求報文由請求行、要求標頭部、空行、請求包體4個部分組成,如所示:

1)請求行
請求行由方法欄位、URL 欄位 和HTTP 協議版本欄位 3 個部分組成,他們之間使用空格隔開。常用的 HTTP 要求方法有 GET、POST。

GET:

  • 當用戶端要從伺服器中讀取某個資源時,使用GET 方法。GET 方法要求伺服器將URL 定位的資源放在響應報文的資料部分,回送給用戶端,即向伺服器請求某個資源。
  • 使用GET方法時,請求參數和對應的值附加在 URL 後面,利用一個問號(“?”)代表URL 的結尾與請求參數的開始,傳遞參數長度受限制,因此GET方法不適合用於上傳資料。
  • 通過GET方法來擷取網頁時,參數會顯示在瀏覽器地址欄上,因此保密性很差。
GET / HTTP/1.1Host: 192.168.11.80:9889User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateConnection: keep-alive

POST:

  • 當用戶端給伺服器提供資訊較多時可以使用POST 方法,POST 方法向伺服器提交資料,比如完成表單資料的提交,將資料提交給伺服器處理。
  • GET 一般用於擷取/查詢資源資訊,POST 會附帶使用者資料,一般用於更新資源資訊。POST 方法將請求參數封裝在HTTP 要求資料中,而且長度沒有限制,因為POST攜帶的資料,在HTTP的請求本文中,以名稱/值的形式出現,可以傳輸大量資料。
POST /search HTTP/1.1  Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, application/x-silverlight, application/x-shockwave-flash, */*  Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>  Accept-Language: zh-cn  Accept-Encoding: gzip, deflate  User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)  Host: <a href="http://www.google.cn">www.google.cn</a>  Connection: Keep-Alive  Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r  hl=zh-CN&source=hp&q=domety 

2)要求標頭部
要求標頭部為請求報文添加了一些附加資訊,由“名/值”對組成,每行一對,名和值之間使用冒號分隔。

要求標頭部通知伺服器有關於用戶端請求的資訊,典型的要求標頭有:

要求標頭 含義
User-Agent 請求的瀏覽器類型
Accept 用戶端可識別的響應內容類型列表,星號“ * ”用於按範圍將類型分組,用“ / ”指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型
Accept-Language 用戶端可接受的自然語言
Accept-Encoding 用戶端可接受的編碼壓縮格式
Accept-Charset 可接受的應答的字元集
Host 請求的主機名稱,允許多個網域名稱同處一個IP 位址,即虛擬機器主機
connection 串連方式(close或keepalive)
Cookie 儲存於用戶端擴充功能欄位,向同一網域名稱的服務端發送屬於該域的cookie

3)空行
最後一個要求標頭之後是一個空行,發送斷行符號符和分行符號,通知伺服器以下不再有要求標頭。

4)請求包體
請求包體不在GET方法中使用,而是POST方法中使用。
POST方法適用於需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型Content-Type和包體長度Content-Length。

2. 響應報文格式2.1 用戶端測試代碼

啟動nginx伺服器:

編寫用戶端程式:

#include <stdio.h>  #include <stdlib.h>  #include <string.h>                         #include <unistd.h>  #include <sys/socket.h>  #include <netinet/in.h>  #include <arpa/inet.h>int main(){     // 建立通訊端點:通訊端    int sockfd = socket(AF_INET, SOCK_STREAM, 0);      // 設定伺服器位址結構體      struct sockaddr_in server_addr;      bzero(&server_addr,sizeof(server_addr)); // 初始化伺服器位址      server_addr.sin_family = AF_INET;   // IPv4      server_addr.sin_port = htons(80); // nginx伺服器監聽的連接埠     inet_pton(AF_INET, "192.168.31.109", &server_addr.sin_addr);   // 伺服器ip       // 主動串連伺服器      int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));      if(err_log != 0)      {          perror("connect");          close(sockfd);          return -1;      }    //http請求報文包    char send_buf[] =         "GET /mike.html HTTP/1.1\r\n"        "Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*\r\n"        "Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3\r\n"        "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)\r\n"        "Accept-Encoding: gzip, deflate\r\n"        "Host: 192.168.31.109:8000\r\n"        "Connection: Keep-Alive\r\n"        "\r\n";    //發送http請求報文包    send(sockfd, send_buf, sizeof(send_buf)-1, 0);    //擷取http響應報文    char recv_buf[8*1024] = {0};    recv(sockfd, recv_buf, sizeof(recv_buf), 0);    printf("%s", recv_buf);    return 0;}

在瀏覽器中輸入url地址,得到test.html網頁:

啟動程式,測試http的成功響應報文:

在瀏覽器中輸入url地址,沒有得到相應網頁:

啟動程式,測試http的失敗響應報文:

2.2 響應報文格式說明

HTTP 響應報文由狀態行、回應標頭部、空行、響應包體4個部分組成,如所示:

1)狀態行
狀態行由 HTTP 協議版本欄位、狀態代碼和狀態代碼的描述文本3個部分組成,他們之間使用空格隔開。

狀態代碼:
狀態代碼由三位元字組成,第一位元字表示響應的類型,常用的狀態代碼有五大類如下所示:

狀態代碼 含義
1xx 表示伺服器已接收了用戶端請求,用戶端可繼續發送請求
2xx 表示伺服器已成功接收到請求並進行處理
3xx 表示伺服器要求用戶端重新導向
4xx 表示用戶端的請求有非法內容
5xx 表示伺服器未能正常處理用戶端的請求而出現意外錯誤

常見的狀態代碼舉例:

狀態代碼 含義
200 OK 用戶端請求成功
400 Bad Request 請求報文有語法錯誤
401 Unauthorized 未授權
403 Forbidden 伺服器拒絕服務
404 Not Found 請求的資源不存在
500 Internal Server Error 伺服器內部錯誤
503 Server Unavailable 伺服器臨時不能處理用戶端請求(稍後可能可以)



2)回應標頭部
回應標頭可能包括:

回應標頭 含義
Location Location響應前序域用於重新導向接受者到一個新的位置
Server Server 響應前序域包含了伺服器用來處理請求的軟體資訊及其版本
Vary 指示不可快取的要求標頭列表
Connection 串連方式

3)空行
最後一個回應標頭部之後是一個空行,發送斷行符號符和分行符號,通知伺服器以下不再有回應標頭部。

4)響應包體
伺服器返回給用戶端的文本資訊。

HTTP協議淺析(中):請求報文和響應報文

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.