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

来源:https://www.cnblogs.com/wangjiming/archive/2018/01/27/8359181.html
-Advertisement-
Play Games

【01】淺談HTTP在WebApi開發中的運用 【02】聊聊WebApi體繫結構 【03】詳解WebApi如何傳遞參數 【04】詳解WebApi測試和PostMan 【05】淺談WebApi Cores 【06】詳解WebApi 異常處理 【07】用WebAPI寫個基於EF的CURD 【08】淺談W ...


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】淺談如何設計一個良好的介面

                                                                     

 


 

一  概述

在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]
  • 可以轉載該博客,但必須著名博客來源。

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

-Advertisement-
Play Games
更多相關文章
  • 項目需求: 一、語言和環境 A、實現語言 C# B、環境要求 Visual Studio 2012 二、功能要求 現使用.NET WinForms技術為居委會開發一個街道管理軟體,其中街道管理窗體界面如圖-4所示。 要求: 1、讀取提供的XML文件(詳見 \提供給學員的素材\Address.xml) ...
  • 1、調用方式上 靜態方法依賴於類,通過類.靜態方法調用;實例方法依賴於類的對象,需要創建對象後,對象.實例方法使用。 2、使用上 實例方法內部不能定義靜態變數,會出現編譯錯誤;實例方法可以直接調用靜態方法;靜態方法內部可以定義和使用實例變數,靜態方法無法直接調用實例方法(因靜態方法載入時類還沒有實例 ...
  • [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int... ...
  • 在.Net 4.5中,通過async和await兩個關鍵字,引入了一種新的基於任務的非同步編程模型(TAP)。在這種方式下,可以通過類似同步方式編寫非同步代碼,極大簡化了非同步編程模型。如下式一個簡單的實例: 而之前的方式是這樣的: 也許前面這個例子不足以體現async和await帶來的優越性,下麵這個例 ...
  • 18 01 26在v2ex上看到一妹紙發的《身為一個 21 歲的年輕程式員,我已經腰突了(躺》,哈哈,感同身受,想到這幾天我左腿麻木持續了好幾天,前幾天屁股疼的只要坐下就站不起來,不過站著卻一點事沒有,然後堅持站了好幾天,目前屁股不疼,腿麻的毛病還沒有恢復。。。[後續] 接觸到的https http ...
  • 新學一詞:達克效應。引出一句:“無知要比知識更容易產生自信。”—— 查爾斯·達爾文 寫在前面 在三亞呆了半個月了,三亞的冬天好熱啊,讓我回憶起了放暑假時下午百無聊賴的時光 { 一睡一下午٩(๑❛ᴗ❛๑)۶ }。 算是從昨天晚上開始調試WebSocket,代碼是16年初正常老代碼copy過來的,不過C ...
  • 前言 Spread for Windows Forms是功能最為強大的表格控制項,擁有靈活開放的對象模型和50,000個以上的API,使得開發人員幾乎可以定製所有的元素和介面。但另一方面,因為Spread的介面非常多,也有一些開發人員反映Spread的入門不太容易。希望我們編寫的“快速入門”系列文章, ...
  • 從記憶體中載入的程式集,無路徑 IIS中路徑 protected void Page_Load(object sender, EventArgs e) { Response.Write("程式集路徑"+System.Reflection.Assembly.GetExecutingAssembly().... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...