日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

web APIS

發(fā)布時間:2023/12/10 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 web APIS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

WEB API系列:

? ? ? ? ? ?很多人都很迷惑,既然有了WCF為什么還要有WEB API?WEB API會不會取代WCF?

?????? 就我的看法,WCF提供的是一種RPC實現(xiàn)的集合,WCF的設(shè)計更多地考慮了SOA的場景,以及各種RPC的問題。很多人也會說,RestFul API也是一種RPC啊,并且WCF中也有關(guān)于RestFul 的實現(xiàn)啊。很多資料中RPC和RestFul在風(fēng)格概念上是有一些區(qū)別的,其實我覺得這兩者的區(qū)別比較主觀,過度糾結(jié)這些就學(xué)院派了;我主要關(guān)注了實際使用上的一些問題,在WCF中,支持的協(xié)議很多,WS-*系列協(xié)議,以及一些更簡潔的協(xié)議,其中提供了一些專用通信協(xié)議的性能是非常高的,并且WCF還提供了服務(wù)發(fā)現(xiàn)等功能,我認(rèn)為WCF更適合內(nèi)部系統(tǒng)間的高性能調(diào)用,社區(qū)中也有其他一些RPC方案可以選擇,例如gRPC,Avor,thrift都是和WCF定位相同的產(chǎn)品;而WEB API是關(guān)注于HTTP RestFul風(fēng)格的產(chǎn)品,在此基礎(chǔ)上,任何語言、任何終端都能非常容易地進行對接,并且能利用非常成熟的各種HTTP基礎(chǔ)設(shè)施和解決方案來進行開發(fā)、調(diào)試、負(fù)載均衡、內(nèi)容分發(fā)。所以,WEB API是一種針對HTTP的,偏重于快速開發(fā)RestFul風(fēng)格開放式API的開發(fā)框架。目前看來,他并不能取代WCF,他們各有適合的場景,不能認(rèn)為WEB API是WCF的替代產(chǎn)品。

?????? OK,現(xiàn)在我們來開發(fā)第一組WEB API接口!使用VS2012以后的版本都有現(xiàn)成的WEB API創(chuàng)建模板,大家跟著創(chuàng)建就好了,創(chuàng)建出來后,項目中會有MVC、WEB API的項目,WEB API對MVC有依賴,不能單獨創(chuàng)建!而WEB API和MVC都是利用類似的路由機制,所以在默認(rèn)路由中,WEB API 使用

/api/{controller}/{id}

?

?????? 作為路由,添加了/api/節(jié)以區(qū)分MVC和web api。

?????? 接下來,我們添加一個WEB API的Controller,取名為PersonController,他繼承于ApiController;在創(chuàng)建這個Controller的時候,我們就定義了一種資源:Person,在PersonController里的所有操作均圍繞著Person這個資源來的。接下來我們開始定義一組增刪改查操作。

?????? 在Web API中,默認(rèn)路由采用了一種約定:根據(jù)謂詞來進行路由,而方法名的前綴就是調(diào)用該方法對應(yīng)使用的HTTP謂詞。代碼示例如下:

??????

/// <summary>/// Person 為資源,對Person進行的一組操作/// </summary>public class PersonController : ApiController{private static List<Person> _personLst = new List<Person>();/// <summary>/// 獲取一個Person/// </summary>/// <param name="id">Person的ID</param>/// <returns>Person</returns>public Person GetPerson(long id){return _personLst.Find(x => x.Id == id);}/// <summary>/// 添加一個Person/// </summary>/// <param name="person">Person</param>public void PostAddPerson(Person person){_personLst.Add(person);}/// <summary>/// 修改一個/// </summary>/// <param name="id">Person Id</param>/// <param name="person">新</param>public void PutModifyPerson(long id, Person person){var p = _personLst.Find(x => x.Id == id);p.Age = person.Age;p.Name = person.Name;p.Sex = person.Sex;}/// <summary>/// 刪除一個Person/// </summary>/// <param name="id">Person ID</param>public void DeletePerson(long id){_personLst.RemoveAll(x => x.Id == id);}}

?

一個簡單的針對資源的CRUD操作的API就好了,不用解析輸入,不用拼接輸出,就是那么簡單!讓我們來遛一遛!

?

發(fā)送請求:謂詞為POST,語義創(chuàng)建Person,Person描述在Body里,head中聲明了Body通過Json序列化。

收到響應(yīng):響應(yīng)碼204,屬于2XX類型執(zhí)行成功,Body里沒有數(shù)據(jù)

?

發(fā)送請求:謂詞為GET,語義為查詢Person資源,Id為1的,head中聲明希望接收使用XML序列化的數(shù)據(jù)

收到響應(yīng):響應(yīng)碼為200,執(zhí)行成功,Body中有數(shù)據(jù),數(shù)據(jù)使用XML序列化

?

發(fā)送請求:謂詞為PUT,語義為修改ID為1的Person資源,修改內(nèi)容在Body中,Content-Type標(biāo)明Body使用Json序列化,在Body中我們將Name修改為Test1Changed

收到響應(yīng),響應(yīng)碼為204,執(zhí)行成功

?

發(fā)送請求:謂詞為GET,語義為查詢ID為1的Person資源,Accept標(biāo)明希望接收到Json數(shù)據(jù)

收到響應(yīng):可以看到Body為使用Json序列化的內(nèi)容,Name屬性已經(jīng)變更為Test1Changed

?

發(fā)送請求:謂詞為DELETE,語義為刪除ID為1的Person資源

收到響應(yīng):響應(yīng)碼204,執(zhí)行成功

?

發(fā)送請求:謂詞為GET,語義為查詢ID為1的Person資源,Accept標(biāo)明希望接收到Json數(shù)據(jù)

收到響應(yīng):響應(yīng)碼為200,執(zhí)行成功,響應(yīng)內(nèi)容為null,資源已刪除

?

這就是我用Fiddler來發(fā)送、調(diào)用的一組RestFul接口,大家可以看到,整個調(diào)用過程使用到了HTTP的語義,用到了謂詞路由、內(nèi)容協(xié)商。在增、刪、改操作中,我都是使用void作為返回值,根據(jù)HTTP Code 判斷,大家也可以自定義一些返回數(shù)據(jù)來做出更進一步的操作描述。

?

在寫了這些API后,我們需要在程序中調(diào)用,我以C#為例寫一組對這些接口調(diào)用的實現(xiàn)。在C#中,傳統(tǒng)調(diào)用HTTP接口一般有兩種辦法: WebRequest/WebResponse組合的方法調(diào)用和WebClient類進行調(diào)用。第一種方法抽象程度較低,使用較為繁瑣;而WebClient主要面向了WEB網(wǎng)頁場景,在模擬Web操作時使用較為方便,但用在RestFul場景下卻比較麻煩,在Web API發(fā)布的同時,.NET提供了兩個程序集:System.Net.Http和System.Net.Http.Formatting。這兩個程序集中最核心的類是HttpClient。在.NET4.5中帶有這兩個程序集,而.NET4需要到Nuget里下載Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client這兩個包才能使用這個類,更低的.NET版本就只能表示遺憾了只能用WebRequest/WebResponse或者WebClient來調(diào)用這些API了。

?????? 在使用中,System.Net.Http這個程序集提供了HttpClient類以及相關(guān)的HTTP調(diào)用,而System.Net.Http.Formatting提供了一些針對HttpClient的幫助擴展,更好地支持了內(nèi)容協(xié)商、Content創(chuàng)建等功能。下面我就和大家一起寫一下這個例子:

?????? 我們新建一個控制臺程序:

?????? 代碼如下:

public class Person{public long Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }public override string ToString(){return $"Id={Id} Name={Name} Age={Age} Sex={Sex}";}}class Program{static void Main(string[] args){var client = new HttpClient();client.BaseAddress = new Uri("http://localhost:22658/"); //基本的API URLclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //默認(rèn)希望響應(yīng)使用Json序列化Run(client);Console.ReadLine();}static async void Run(HttpClient client){var result = await AddPerson(client);Console.WriteLine($"添加結(jié)果:{result}"); //添加結(jié)果:truevar person = await GetPerson(client);Console.WriteLine($"查詢結(jié)果:{person}"); //查詢結(jié)果:Id=1 Name=test Age=10 Sex=Fresult = await PutPerson(client);Console.WriteLine($"更新結(jié)果:{result}"); //更新結(jié)果:trueresult = await DeletePerson(client);Console.WriteLine($"刪除結(jié)果:{result}"); //刪除結(jié)果:true}static async Task<bool> AddPerson(HttpClient client){return await client.PostAsJsonAsync("api/Person", new Person() { Age = 10, Id = 1, Name = "test", Sex = "F" }) //向Person發(fā)送POST請求,Body使用Json進行序列化.ContinueWith(x => x.Result.IsSuccessStatusCode); //返回請求是否執(zhí)行成功,即HTTP Code是否為2XX}static async Task<Person> GetPerson(HttpClient client){return await await client.GetAsync("api/Person/1") //向Person發(fā)送GET請求.ContinueWith(x => x.Result.Content.ReadAsAsync<Person>( //獲取返回Body,并根據(jù)返回的Content-Type自動匹配格式化器反序列化Bodynew List<MediaTypeFormatter>() {new JsonMediaTypeFormatter()/*這是Json的格式化器*/,new XmlMediaTypeFormatter()/*這是XML的格式化器*/}));}static async Task<bool> PutPerson(HttpClient client){return await client.PutAsJsonAsync("api/Person/1", new Person() { Age = 10, Id = 1, Name = "test1Change", Sex = "F" }) //向Person發(fā)送PUT請求,Body使用Json進行序列化.ContinueWith(x => x.Result.IsSuccessStatusCode); //返回請求是否執(zhí)行成功,即HTTP Code是否為2XX}static async Task<bool> DeletePerson(HttpClient client){return await client.DeleteAsync("api/Person/1") //向Person發(fā)送DELETE請求.ContinueWith(x => x.Result.IsSuccessStatusCode); //返回請求是否執(zhí)行成功,即HTTP Code是否為2XX}}

轉(zhuǎn)載于:https://www.cnblogs.com/fs-4394/p/9981312.html

總結(jié)

以上是生活随笔為你收集整理的web APIS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。