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

WebApi系列文章html

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

【02】聊聊WebApi體系結構api

【03】詳解WebApi參數的傳遞瀏覽器

【04】詳解WebApi測試和PostMan安全

【05】淺談WebApi Cores服務器

【06】詳解WebApi 異常處理網絡

【07】用WebAPI寫個基於EF的CURD架構

【08】淺談WebAPI身份認證app

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

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

【11】淺談API Reference

【12】淺談接口在軟件架構中的做用

【13】淺談WebApi和WebService的比較

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

                                                                     

 


 

一  概述

在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/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分爲原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:2098469527@qq.com。
  • 能夠轉載該博客,但必須著名博客來源。
相關文章
相關標籤/搜索