Http基礎

来源:http://www.cnblogs.com/qifengshi/archive/2016/04/04/5352238.html
-Advertisement-
Play Games

Http基礎 這篇文章是講 網路請求的先導文章,主要講 工作流程,請求報文和響應報文的格式,以及 和`POST`方法的具體含義。 Http工作流程 是一個客戶端和伺服器端請求和應答的標準( )。客戶端是終端用戶,伺服器端是網站。通過使用 瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定端 ...


Http基礎

這篇文章是講Android網路請求的先導文章,主要講Http工作流程,請求報文和響應報文的格式,以及GETPOST方法的具體含義。

Http工作流程

HTTP是一個客戶端和伺服器端請求和應答的標準(TCP)。客戶端是終端用戶,伺服器端是網站。通過使用Web瀏覽器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠(預設埠為80)的HTTP請求。(我們稱這個客戶端)叫用戶代理(user agent)。應答的伺服器上存儲著(一些)資源,比如HTML文件和圖像。(我們稱)這個應答伺服器為源伺服器(origin server)。在用戶代理和源伺服器中間可能存在多個中間層,比如代理,網關,或者隧道(tunnels)。儘管TCP/IP協議是互聯網上最流行的應用,HTTP協議並沒有規定必須使用它和(基於)它支持的層。 事實上,HTTP可以在任何其他互聯網協議上,或者在其他網路上實現。HTTP只假定(其下層協議提供)可靠的傳輸,任何能夠提供這種保證的協議都可以被其使用。
這裡我們規定下文討論的HTTP都是基於tcp協議的,至於為什麼不是udp,原因在於(打開)一個網頁必須傳送很多數據,而TCP協議提供傳輸控制,按順序組織數據,和錯誤糾正。
我們用一個例子來說明http在通信的時候IP, TCP, DNS分別做了什麼工作。

客戶端發起請求,想要瀏覽百度這個網頁,他先告訴DNS,獲取百度這個網頁的IP地址,然後HTTP協議生成針對目標web伺服器的HTTP請求報文,TCP協議則為了方便通信,將HTTP請求報文分割成報文段,把每個報文可靠地傳給對方。IP協議則搜索對方的地址,一邊中轉一邊傳送
伺服器端,TCP協議負責從對方那裡接收到報文段,重組到達的報文段,HTTP則負責對WEB伺服器請求的內容進行處理。然後結果同樣利用TCP/IP向用戶回傳。

我們仔細看一下上面的流程,去掉TCP,IP ,DNS在裡面做的工作,首先客戶端發起請求,向伺服器請求一個頁面的內容,通常是在瀏覽器裡面輸入一個網址(URL)這個網址叫URL(統一資源定位符),他只是表示資源所在的地點,在網路中更常見的是URI(統一資源標識符),他是URL的超集,在後面我們討論的資源路徑都是用URI表示的,我們可以看一個絕對URI的例子。

http://user:[email protected]:80/dir/index.htm?uid=1#ch1
http:協議方案名
user:pass 登錄信息 (登錄伺服器的身份認證,可省略)
www.example.cn 伺服器地址(可以是DNS可解析的名稱,也可以時IP)
80 伺服器埠號 (可選,不填則預設是80)
dir/index.htm 帶層次的文件路徑 (指定伺服器上的文件路徑來定位特指的資源)
uid=1 查詢字元串 (針對已制定的文件路徑內的資源,使用查詢字元串傳入任意參數)
#ch1 片段標識符 (無明確用法,不予討論 ,可忽略)

那麼在瀏覽器或者其他工具中輸入URI後是怎麼應用的呢?答案是HTTP請求報文(後面會講),HTTP根據輸入的URI和其他參數生成HTTP請求報文發送給伺服器,忽略中間傳輸過程,HTTP伺服器得到請求報文後,會對其進行解析,然後根據請求內容查詢伺服器的資源,再以響應報文的形式傳回給客戶端。客戶端解析響應報文的內容,根據報文的內容進行下一步的任務。

請求報文與響應報文的格式

用於HTTP協議交互的信息被稱為HTTP報文。請求端的HTTP報文叫做請求報文,響應段(伺服器端)的叫做響應報文。HTTP報文本身是由多行數據構成的字元串文本。用(CR+LF做換行符,CR回車符,16進位0x0d,LF換行符,16進位0x0a)
下圖就是請求報文的格式
請求報文格式
上圖可以看到請求報文是由報文首部,空行,報文實體構成的。報文首部在通信中至關重要,因為重要作用的信息幾乎都在這邊。報文主體是所需要的用戶和資源信息在這邊。
下麵我們重點說一下首部欄位。使用首部欄位是為了給瀏覽器和伺服器提供報文主體大小,所使用的語言,認證信息等內容。HTTP首部欄位是由首部欄位名和欄位值構成的,中間用冒號":"分割。在請求報文中首部欄位根據實際用處被分為以下3種格式

  1. 通用首部欄位
  2. 請求首部欄位
  3. 實體首部欄位

其中實體首部欄位是針對報文的實體部分使用的首部,補充了資源內容更新時間等與實體有關的信息。
下麵的表格顯示了常用首部欄位的類型有哪些
通用首部欄位
| 首部欄位名 | 說明 |
| :-------- |:--------|
| Cache-Control|控制緩存的行為 |
|Date|創建報文的日期時間|
|Connection|逐跳首部、連接的管理|
|Transfer-Encoding|指定報文主體的傳輸編碼方式|
請求首部欄位
|首部欄位名| 說明|
|:--------|:--------|
|Accept|用戶代理可處理的媒體類型|
|Accept-Charset|優先的字元集|
|Accept-Encoding|優先的內容編碼|
|Accept-Language|優先的語言(自然語言)|
|Authorization|Web認證信息|
|Host|請求資源所在伺服器|
|User-Agent|HTTP 客戶端程式的信息|
實體首部欄位
|首部欄位名|說明|
|:---- |:----- |
|Allow|資源可支持的HTTP方法|
|Content-Encoding|實體主體適用的編碼方式|
|Content-Type|實體主體的媒體類型|
|Content-Length|實體主體的大小(單位:位元組)|
|Content-Location|替代對應資源的URI|

關於每個欄位的含義可以參考一下《圖解http協議》這本書。
下麵我們看一下響應報文的格式
響應報文
由上圖可以看出來,響應報文格式和請求報文大同小異,都是有保溫首部,空行,報文實體組成。不同的是,組成報文首段的是通用首部,響應首部和實體首部組成。狀態行的不同和響應首部的增加是響應報文有別於請求報文的地方,我們重點看一下狀態行。
狀態行中需要HTTP的版本,狀態碼和短語
下麵的表格顯示了狀態碼和短語

狀態碼 類別 原因短語
1xx Informational(信息性狀態碼) 接收的請求正在處理
2xx Success(成功狀態碼) 請求正常處理完畢
3xx Redirection(重定向狀態碼) 需要進行附加操作以完成請求
4xx Client Error(客戶端錯誤狀態碼) 伺服器無法處理請求
5xx Server Error(伺服器錯誤狀態碼) 伺服器處理請求出錯

狀態碼種類繁多,我們介紹實際上常用的幾種

200 OK 表示從客戶端發來的請求在伺服器端被正常處理了。
204 No Content 該狀態碼代表伺服器接收的請求已成功處理,但在返回的響應報文中不含實體的主體部分。
206 Partial Content 該狀態碼表示客戶端進行了範圍請求,而伺服器成功執行了這部分的 GET 請求。響應報文中包含由 Content-Range 指定範圍的實體內容。
301 Moved Permanently 永久性重定向。該狀態碼表示請求的資源已被分配了新的 URI,以後應使用資源現在所指的 URI
302 Found 臨時性重定向。該狀態碼表示請求的資源已被分配了新的 URI,希望用戶(本次)能使用新的 URI 訪問。
303 See Other 該狀態碼表示由於請求對應的資源存在著另一個 URI,應使用 GET 方法定向獲取請求的資源。
304 Not Modified 該狀態碼表示客戶端發送附帶條件的請求時,伺服器端允許請求訪問資源,但未滿足條件的情況。
400 Bad Request 該狀態碼表示請求報文中存在語法錯誤
401 Unauthorized 該狀態碼表示發送的請求需要有通過 HTTP 認證(BASIC 認證、DIGEST 認證)的認證信息。另外若之前已進行過 1 次請求,則表示用 戶認證失敗。
403 Forbidden 該狀態碼表明對請求資源的訪問被伺服器拒絕了。
404 Not Found 該狀態碼表明伺服器上無法找到請求的資源。除此之外,也可以在伺服器端拒絕請求且不想說明理由時使用。
500 Internal Server Error 該狀態碼表明伺服器端在執行請求時發生了錯誤。
503 Service Unavailable 該狀態碼表明伺服器暫時處於超負載或正在進行停機維護,現在無法處理請求。
接下來,我們看一下響應首部欄位的幾個欄位的含義。

首部欄位名 說明
Accept-Ranges 是否接受位元組範圍請求
Retry-After 對再次發起請求的時機要求
ETag 資源的匹配信息

上面就是我們對請求報文和響應報文的簡單介紹

GET和POST

這篇文章主要是Android網路請求的先導文章,所以這裡我們主要介紹Android網路請求的時候2個主要的方法,GETPOST
網上有很多說法關於GET和POST的區別,大家可以看看這篇文章GET和POST真正的區別,這個不是我們這篇文章要討論的內容,我們只需要記住一點,GET是從伺服器獲取數據,POST是改變伺服器數據就可以了。
GET方法用於獲取由URI所標示的資源信息,他是將請求參數直接放到URL後面,第一個參數前有一個"?",參數格式為 參數名=參數值,參數之間通過"&"鏈接
POST用於修改伺服器的數據,所以他的參數一般存儲在報文的報文主體。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當IE8發佈時,它將支持很多新的CSS display屬性值,包括與表格相關的屬性值:table、table-row和table-cell,它也是最後一款支持這些屬性值的主流瀏覽器。它標志著複雜CSS佈局技術的結束,同時也給了HTML表格佈局致命一擊。最終,使用CSS佈局來製作出類似於table佈局 ...
  • IP:是網路中唯一標識一臺電腦的邏輯標識。 特例:127.0.0.1 localhost 例子:192.168.33.xxx (對應門牌號碼,身份證號碼) 點分十進位形式,分成四段 範圍:0~255.0~255. 0~255. 0~255 DN:Domain Name 功能變數名稱 例子:www.baidu... ...
  • 瀏覽器相容性常見 瀏覽器相容問題⼀:不同瀏覽器的標簽預設的外補丁和內補丁不同 問題癥狀:隨便寫⼏個標簽,不加樣式控制的情況下,各⾃的margin 和padding差異較⼤。 碰到頻率:100% 解決⽅案:CSS⾥ *{margin:0;padding:0;} 備註:這個是最常 的也是最易解決的⼀個瀏 ...
  • 之前在公司做項目的時候,有這麼一個需求,要我寫一個評論框,可以隨著評論的行數增加而自動擴大,最開始我想用textarea實現,但是後來嘗試後發現textarea並不適合,textarea的高度不會隨著輸入行數的增多而增大,於是我上網尋求了下幫助,發現大神張鑫旭的這篇文章《div模擬textarea文 ...
  • 如果你把這些當做文章來看,那你始終是學不會,而是應該當做手冊來看,這些也是自己在寫網站遇到的問題。轉載請出處。 追夢子前端博客。 1. logo添加內容給h1設置text-index:-9999px的時候會把裡面的其他標簽也給定位過去。 解決方法:如果要添加內容,那麼圖片用背景來做。 2. butt ...
  • js面向對象的組成是 1、屬性 2、方法 使用的時候是再構造函數裡面加屬性,在原型裡面加方法。 如果直接在構造函數裡面:傳值、新建對象、增加屬性/方法、返回對象的這種方法,會產生問題,主要是 1、沒有new 2、函數重覆定義,這樣會讓資源浪費 所以,我們要在構造函數裡面使用this構造屬性,把方法放 ...
  • jquery現在的事件API:on,off,trigger支持帶命名空間的事件,當事件有了命名空間,就可以有效地管理同一事件的不同監聽器,在定義組件的時候,能夠避免同一元素應用到不同組件時,同一事件類型之間的影響,還能控制一些意外的事件冒泡。在實際工作中,相信大家都用的很多,但是不一定瞭解它的所有細 ...
  • 軟體測試作為程式員必備的一項技能是決定軟體開發周期長短以及軟體運行成敗的關鍵,可以說好的軟體不是代碼寫得好而是有效的測試決定的。本文將介紹在android下利用eclipse進行開發時如何使用JUnit進行單元測試。 一、測試的分類(僅舉例其中一些方法) 【根據測試是否知道代碼】 1、黑盒測試(測試 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...