【01】淺談HTTP在WebApi開發中的運用 【02】聊聊WebApi體繫結構 【03】詳解WebApi如何傳遞參數 【04】詳解WebApi測試和PostMan 【05】淺談WebApi Cores 【06】詳解WebApi 異常處理 【07】用WebAPI寫個基於EF的CURD 【08】淺談W ...
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協議定義了瀏覽器怎樣向萬維網伺服器請求萬維網文檔,以及伺服器怎樣把文檔傳送給瀏覽器,大致工作流程圖如下圖所示。
1.一次TCP連接,需要三個過程:建立連接(三次握手)、傳送數據和釋放連接(四次揮手);
2.http是基於TCP/IP協議的,且在五層模型中的運用層協議;
3.客戶端請求URL,如上圖的http://www.googl.com.hk;
4.伺服器會根據客戶端的請求,給予相應的響應(Responce);
下麵,我們將簡要列舉涉及到的部分關鍵技術,分別如下:
(一)基於TCP/IP
關於網路傳輸模型,早期大致有四層模型結構和七層模型結構,經過演變,最終將四層模型結構和七層模型結構歸結為五層結構模型。
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協議具有很多優秀的特點,下圖只是簡要的列舉其部分特點。
1.簡單快速:http協議簡單,客戶端向伺服器發送請求時,只需傳送請求方法和路徑即可,傳送的內容簡單輕量級,減少傳輸帶寬,速度快;
2.B/S模式:B/S模式(Browse/Server模式),也叫客戶端(Google,firefox,ie)/伺服器模式,在Web開發中,基本都是基於B/S模式;
3.無連接:http協議本身是無連接的,雖然http使用了tcp連接,但通信雙方在交換http保溫之前不需要先建立http連接;
4.無狀態:無狀態是指協議對於事務處理沒有記憶能力,也就是說,同一個客戶第二次訪問同一個伺服器上的頁面時,伺服器的響應與第一次被訪問的相同;
(三)三次握手
每一次TCP連接都需要三個階段:建立連接、傳送數據和釋放連接。三次握手就發生在建立連接階段,其大致流程如下圖所示。
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後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。 1.TCP客戶端發送一個FIN,用來關閉客戶到伺服器的數據傳送。 2. 伺服器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。 3.伺服器關閉客戶端的連接,發送一個FIN給客戶端。 4.客戶端發回ACK報文確認,並將確認序號設置為收到序號加1。(五)URI、URL與URN
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幾個關鍵概念
這個比較基礎,學過計算網路的朋友,都應該知道,這裡就不解釋了,大致輪廓圖如下所示。
二 HTTP
(一)http請求
1.http請求一般由三部分構成:<請求行><請求頭><請求體>
(1)請求行:<Method><Request-url><version>
GET http://localhost:2172/api/Default/GetUserInfo?UserName=Alan_beijing HTTP1.1
圖解如下:
(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請求方法
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請求頭域列於如下。
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 位數字組成, 表示響應的狀態。
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空基架
修改WebApiConfi.cs路由配置和在控制器Default添加方法GetUserInfo
測試結果
三 版權區
- 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
- 博主網址:http://www.cnblogs.com/wangjiming/。
- 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
- 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]。
- 可以轉載該博客,但必須著名博客來源。