天天看點

【WebApi系列】淺談HTTP在WebApi開發中的運用

WebApi系列文章

【01】淺談HTTP在WebApi開發中的運用

【02】聊聊WebApi體系結構

【03】詳解WebApi參數的傳遞

【04】詳解WebApi測試和PostMan

【05】淺談WebApi Cores

【06】詳解WebApi 異常處理

【07】用WebAPI寫個基于EF的CURD

【08】淺談WebAPI身份認證

【09】詳解系列化和模型綁定

【10】淺談WebApi如何配合Mvc有效工作

【11】淺談API Reference

【12】淺談接口在軟體架構中的作用

【13】淺談WebApi和WebService的比較

【14】淺談如何設計一個良好的接口

【WebApi系列】淺談HTTP在WebApi開發中的運用

一  概述

在Web開發中,HTTP是必不可少的環節,在之前的【ASP.NET MVC系列】中,我們并沒有講解HTTP,并不是因為ASP.NET MVC與http關系不大,而是筆者個人覺得http與WebApi結合起來講解,

效果可能會更好一些,是以,暫且就把“詳解http”作為【WebApi系列】的開篇文章。

1.http是什麼?

http是一種基于應用層的一種超文本傳輸協定(HyperText Transfer Protocol)

2.本章主要講解什麼?

本章目的就講解:當我們在浏覽器輸入:http://www.google.com.hk/,浏覽器給我們呈現Google界面,這個過程發生了什麼,我暫且将發生的内容歸于如下幾點:

(1).域名解析

(2).TCP建立連接配接(三次握手)

(3).TCP通信(傳遞資料)

(4).斷開連接配接(四次揮手)

基于如上過程,我們将分系一下:

(1)HTTP 請求

(2)HTTP響應

那麼,我們先來看看。

HTTP協定定義了浏覽器怎樣向網際網路伺服器請求網際網路文檔,以及伺服器怎樣把文檔傳送給浏覽器,大緻工作流程圖如下圖所示。

【WebApi系列】淺談HTTP在WebApi開發中的運用

1.一次TCP連接配接,需要三個過程:建立連接配接(三次握手)、傳送資料和釋放連接配接(四次揮手);

2.http是基于TCP/IP協定的,且在五層模型中的運用層協定;

3.用戶端請求URL,如上圖的http://www.googl.com.hk;

4.伺服器會根據用戶端的請求,給予相應的響應(Responce);

下面,我們将簡要列舉涉及到的部分關鍵技術,分别如下:

(一)基于TCP/IP

關于網絡傳輸模型,早期大緻有四層模型結構和七層模型結構,經過演變,最終将四層模型結構和七層模型結構歸結為五層結構模型。

【WebApi系列】淺談HTTP在WebApi開發中的運用

1.五層結構模型:運用層、傳輸層、網絡層、資料鍊路層和實體層;

2.傳輸協定:基于TCP/IP

3.http協定是基于運用層的協定;

4.五層結構中,從縱向上來說,用戶端是從上往下傳輸,服務端是從下往上接受;

5.五層結構中,從橫向上來說,每一層的協定必須是相同的,至少是相似(一般我們在分析層時,将會橫向上虛拟抽象,屏蔽其他層);

6.運用層支援多種傳輸協定,如http協定,smtp協定,ftp協定等;

7.區分幾個概念:TCP/IP協定,TCP協定和UDP協定

  (1)TCP/IP協定:TCP/IP是一組包括TCP協定和IP協定,UDP(User Datagram Protocol)協定、ICMP(Internet Control Message Protocol)協定和其他一些協定的協定組;

  (2)TCP協定:傳輸層中的傳輸控制協定;

  (3)UDP協定:傳輸層中的資料報問協定;

(二)特點

http協定具有很多優秀的特點,下圖隻是簡要的列舉其部分特點。

【WebApi系列】淺談HTTP在WebApi開發中的運用

1.簡單快速:http協定簡單,用戶端向伺服器發送請求時,隻需傳送請求方法和路徑即可,傳送的内容簡單輕量級,減少傳輸帶寬,速度快;

2.B/S模式:B/S模式(Browse/Server模式),也叫用戶端(Google,firefox,ie)/伺服器模式,在Web開發中,基本都是基于B/S模式;

3.無連接配接:http協定本身是無連接配接的,雖然http使用了tcp連接配接,但通信雙方在交換http保溫之前不需要先建立http連接配接;

4.無狀态:無狀态是指協定對于事務處理沒有記憶能力,也就是說,同一個客戶第二次通路同一個伺服器上的頁面時,伺服器的響應與第一次被通路的相同;

(三)三次握手

每一次TCP連接配接都需要三個階段:建立連接配接、傳送資料和釋放連接配接。三次握手就發生在建立連接配接階段,其大緻流程如下圖所示。

【WebApi系列】淺談HTTP在WebApi開發中的運用

1.第一次握手:用戶端請求連接配接。用戶端向伺服器送出請求連接配接(client向server發送sys=j的包),進入發送請求狀态(syn_sent狀态),并等待伺服器确認。

2.第二次握手:伺服器接受請求并向用戶端發出确認資訊。當伺服器收到syn包後,先确認客戶的syn(ack=j+1),同時也需要釋出一個syn包(syn=k),即syn+ack包,此時伺服器進入syn_recv狀态。

3.第三次握手:建立連接配接。用戶端收伺服器的syn+ack包後,向伺服器發棕确認包ack(ack=k+1),當此包發送完畢後,用戶端和伺服器就進入了連接配接狀态(連接配接成功),完成三次握手;

如上似乎有些抽象,我們舉個打電話的例子:

我們打電話的目的是為了傳遞資訊,在打電話前,我們需要先撥通對方的電話且對方應答之後,才能通電話(建立連接配接),以A,B兩人通電話為例子:

A:撥打B的手機(撥号,撥通後等待B接電話,相當于第一次握手,請求等待狀态);

B:看到A打來的電話(是A才接,确認),接了電話,對A說:您好,老A(向A表明自己是B,相當于第二次握手) ;

A:您好啊,老B(第三次握手);

雙方都問候,表名自己身份後,就可以正式通話了(三次握手結束)。

(四)四次揮手

    TCP連接配接是全雙工的,是以每個方向都必須單獨進行關閉。當一方完成它的資料發送任務後就能發送一個FIN來終止這個方向的連接配接,收到一個 FIN隻意味着這一方向上沒有資料流動,

一個TCP連接配接在收到一個FIN後仍能發送資料。首先進行關閉的一方将執行主動關閉,而另一方執行被動關閉。

【WebApi系列】淺談HTTP在WebApi開發中的運用

1.TCP用戶端發送一個FIN,用來關閉客戶到伺服器的資料傳送。

2. 伺服器收到這個FIN,它發回一個ACK,确認序号為收到的序号加1。和SYN一樣,一個FIN将占用一個序号。

3.伺服器關閉用戶端的連接配接,發送一個FIN給用戶端。

4.用戶端發回ACK封包确認,并将确認序号設定為收到序号加1。

 (五)URI、URL與URN

【WebApi系列】淺談HTTP在WebApi開發中的運用

1.URI、URL和URN定義 

     URI(Uniform Resource Identifier)代表統一資源辨別符,辨別資源的字元串;

     URL (Uniform Resource Locator)代表統一資源定位符,網際網路上标準資源的位址;

     URN(Uniform Resources Name)代表統一資源名稱,網際網路上資源的名稱;

2. 對URI、URL和URN三者之間解析

    (1)從命名角度,URI辨別資源且唯一,URL辨別資源位址 ,URN辨別資源名稱;

    (2)從數學關系:URI=URL+URN+URL∩URN;很容易看出,URL一定是URI,但URI不一定是URL,同理,URN一定是URI,但URI不一定是URN;

3. URL應具有特點

     (1)  域名便于記憶和拼寫;

     (2)  簡短;

     (3)  便于輸入;

     (4)  可以反映出站點結構;

     (5)  應該是“可破解的”,使用者可以通過移除URL的末尾,進而到達更高層次的資訊體系結構;

     (6)  持久、不能改變

4  小結

       通常情況下,URI代表同意資源辨別符(Uniform Resource Identifier)。URI是辨別了一個資源的字元串。從技術角度看,所有URL都是URI。W3C認為“URL是一個非正式的概念,但它非常有用:

URL是URI的一種類型,它通過表示自身的主要通路機制來辨別資源”,換句話說,URI是某種資源的辨別符,而URL則為擷取該資源提供了具體的資訊。

       注釋:資源是一個抽象概念,既可以指一個檔案,也可以指方法調用的結果或伺服器上的一些其他内容。

(六)HTTP幾個關鍵概念

這個比較基礎,學過計算網絡的朋友,都應該知道,這裡就不解釋了,大緻輪廓圖如下所示。

【WebApi系列】淺談HTTP在WebApi開發中的運用

 二  HTTP

(一)http請求

1.http請求一般由三部分構成:<請求行><請求頭><請求體>

(1)請求行:<Method><Request-url><version>
      
GET http://localhost:2172/api/Default/GetUserInfo?UserName=Alan_beijing  HTTP1.1      
圖解如下:

        
【WebApi系列】淺談HTTP在WebApi開發中的運用
(2)請求頭:header
      
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:2172
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36      
(3)請求體:Request-Body
由于本示例使用的是Get請求,Get方法沒有請求體。      

2.http請求方法

【WebApi系列】淺談HTTP在WebApi開發中的運用

2.1Get

(1)一般由于擷取查詢資源,對應DB中的Select操作,為http請求常用方法 ;(2)該操作對系統來說,是安全的,因為其隻查詢而不修改資料;

(3)冥等的,對同一URL多次請求得到的結果應該是相同的;(4)參數在URL中傳遞,而非Rquest-Body中傳遞;

(5)有長度限制,如IE : 2803 ;Firefox:65536 ;Chrome:8182  ; Safari:80000 ; Opera:190000 (6)不安全,因為參數暴露在url中

2.2.Post

(1)一般用于向系統中更新資料,對應DB中的Update操作,為http請求常用方法;(2)參數在Requet-Body中傳遞 ;

(3)相比較Get,較為安全

2.3.Put

(1)一般用于向系統中插入資料(當然,其功能Post也能實作,與Post有很多相似之處),對應DB中的Insert操作;

(2)傳輸内容放在Request-Body中;

(3)不安全,不帶驗證機制,故一般不使用該方法;

2.4.Delete

(1)一般用于向系統中删除資料,對應DB中的Delete操作;

(2)不帶驗證機制,故不安全;

2.5.Head

(1) 用法與Get一樣,隻不過Head隻傳回Http-Responce頭部資訊;

(2)由于Head隻傳回頭部資訊(相對于Get,輕量級),故一般被用于确認URI的有效性,資源更新的日期時間等;

2.6.Patch

(1)部分文檔更改;

2.7.Trace

(1)追蹤路徑,如追蹤一個資源請求中間所經過的代理;(2)回顯伺服器收到的請求,主要用于測試或診斷;

2.8.Copy

(1)拷貝指定資源到目标位置;

2.9.Options

(1)一般用來詢問URI支援的方法;(2)查詢伺服器的性能

2.10.Link

(1)建立連接配接關系;

2.11.UnLink

(1)斷開連結關系

2.12.Purge

(1)清除;

2.13.PropFind

(1)檢視屬性

2.14.View

(1)檢視

2.15.Connect

(1)隧道協定連接配接代理

2.16.Move

(1)将伺服器資源移動到目标位置;

2.17.Wrapped

(1)允許用戶端發送封裝過的請求;

2.18.Extension-Method

(1)基于不變協定的前提下,可增加其他方法;

2.19.Lock

(1)加鎖;

2.20.UnLock

(1)解鎖;

3.請求頭

現将常用的http請求頭域列于如下。

【WebApi系列】淺談HTTP在WebApi開發中的運用
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:2172
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36      

(二)http響應

1.http響應一般由三部分構成:<狀态行><響應頭><響應體>;

2.狀态行

2.1 狀态行構成

 狀态行一般由三個部分構成:<協定及其版本><狀态碼><描述>,

HTTP/1.1 200 OK;      

2.2 狀态代碼和常見狀态碼

狀态代碼由 3 位數字組成, 表示響應的狀态。

【WebApi系列】淺談HTTP在WebApi開發中的運用

 3.響應頭

關于響應頭,與請求頭原理差不多,這裡就不講解了。

Cache-Control:no-cache
Content-Length:123
Content-Type:application/xml; charset=utf-8
Date:Sat, 27 Jan 2018 09:54:22 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/10.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNcQWxhbl9iZWlqaW5nXHNvdXJjZVxyZXBvc1xIdHRwRGVtb1xIdHRwRGVtb1xhcGlcRGVmYXVsdFxHZXRVc2VySW5mbw==?=      

(三)例子

1.用VS2017寫一個WebApi Get,步驟如下:

選擇Web基架

【WebApi系列】淺談HTTP在WebApi開發中的運用

 添加WebApi空基架

【WebApi系列】淺談HTTP在WebApi開發中的運用

 修改WebApiConfi.cs路由配置和在控制器Default添加方法GetUserInfo

【WebApi系列】淺談HTTP在WebApi開發中的運用

 測試結果

【WebApi系列】淺談HTTP在WebApi開發中的運用

三   版權區

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 部落客網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複制和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該部落格,但必須著名部落格來源。