许多人都很疑惑,既然有了WCF为何还要有WEB API?WEB API会不会庖代WCF?
就我的意见,WCF供应的是一种RPC完成的鸠合,WCF的设想更多地斟酌了SOA的场景,以及种种RPC的题目。许多人也会说,RestFul API也是一种RPC啊,而且WCF中也有关于RestFul 的完成啊。许多资估中RPC和RestFul在作风概念上是有一些辨别的,实在我以为这两者的辨别比较主观,过分纠结这些就学院派了;我重要关注了实际运用上的一些题目,在WCF中,支撑的协定许多,WS-*系列协定,以及一些更简约的协定,个中供应了一些专用通信协定的机能是异常高的,而且WCF还供应了效劳发明等功能,我以为WCF更合适内部体系间的高机能挪用,社区中也有其他一些RPC计划能够挑选,比方gRPC,Avor,thrift都是和WCF定位雷同的产物;而WEB API是关注于HTTP RestFul作风的产物,在此基础上,任何言语、任何终端都能异常容易地举行对接,而且能应用异常成熟的种种HTTP基础设施和解决计划来举行开辟、调试、负载平衡、内容分发。所以,WEB API是一种针对HTTP的,偏重于疾速开辟RestFul作风开放式API的开辟框架。如今看来,他并不能庖代WCF,他们各有合适的场景,不能以为WEB API是WCF的替换产物。
OK,如今我们来开辟第一组WEB API接口!运用VS2012今后的版本都有现成的WEB API建立模板,人人随着建立就好了,建立出来后,项目中会有MVC、WEB API的项目,WEB API对MVC有依靠,不能零丁建立!而WEB API和MVC都是应用相似的路由机制,所以在默许路由中,WEB API 运用
/api/{controller}/{id}
作为路由,增加了/api/节以辨别MVC和web api。
接下来,我们增加一个WEB API的Controller,取名为PersonController,他继续于ApiController;在建立这个Controller的时刻,我们就定义了一种资本:Person,在PersonController里的一切操纵均围绕着Person这个资本来的。接下来我们最先定义一组增编削查操纵。
在Web API中,默许路由采用了一种商定:依据谓词来举行路由,而要领名的前缀就是挪用该要领对应运用的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就好了,不必剖析输入,不必拼接输出,就是那末简朴!让我们来遛一遛!
发送要求:谓词为POST,语义建立Person,Person形貌在Body里,head中声清楚明了Body经由历程Json序列化。
收到相应:相应码204,属于2XX范例实行胜利,Body里没有数据
发送要求:谓词为GET,语义为查询Person资本,Id为1的,head中声明愿望吸收运用XML序列化的数据
收到相应:相应码为200,实行胜利,Body中有数据,数据运用XML序列化
发送要求:谓词为PUT,语义为修正ID为1的Person资本,修正内容在Body中,Content-Type标明Body运用Json序列化,在Body中我们将Name修正为Test1Changed
收到相应,相应码为204,实行胜利
发送要求:谓词为GET,语义为查询ID为1的Person资本,Accept标明愿望吸收到Json数据
收到相应:能够看到Body为运用Json序列化的内容,Name属性已变更为Test1Changed
发送要求:谓词为DELETE,语义为删除ID为1的Person资本
收到相应:相应码204,实行胜利
发送要求:谓词为GET,语义为查询ID为1的Person资本,Accept标明愿望吸收到Json数据
收到相应:相应码为200,实行胜利,相应内容为null,资本已删除
这就是我用Fiddler来发送、挪用的一组RestFul接口,人人能够看到,全部挪用历程运用到了HTTP的语义,用到了谓词路由、内容协商。在增、删、改操纵中,我都是运用void作为返回值,依据HTTP Code 推断,人人也能够自定义一些返回数据来做出更进一步的操纵形貌。
在写了这些API后,我们需要在顺序中挪用,我以C#为例写一组对这些接口挪用的完成。在C#中,传统挪用HTTP接口平常有两种方法: WebRequest/WebResponse组合的要领挪用和WebClient类举行挪用。第一种要领笼统水平较低,运用较为烦琐;而WebClient重要面向了WEB网页场景,在模仿Web操纵时运用较为轻易,但用在RestFul场景下却比较贫苦,在Web API宣布的同时,.NET供应了两个顺序集:System.Net.Http和System.Net.Http.Formatting。这两个顺序集中最中心的类是HttpClient。在.NET4.5中带有这两个顺序集,而.NET4需要到Nuget里下载Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client这两个包才运用这个类,更低的.NET版本就只能表示遗憾了只能用WebRequest/WebResponse或许WebClient来挪用这些API了。
在运用中,System.Net.Http这个顺序集供应了HttpClient类以及相干的HTTP挪用,而System.Net.Http.Formatting供应了一些针对HttpClient的协助扩大,更好地支撑了内容协商、Content建立等功能。下面我就和人人一同写一下这个例子:
我们新建一个控制台顺序:
代码以下:
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 URL client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //默许愿望相应运用Json序列化 Run(client); Console.ReadLine(); } static async void Run(HttpClient client) { var result = await AddPerson(client); Console.WriteLine($"增加效果:{result}"); //增加效果:true var person = await GetPerson(client); Console.WriteLine($"查询效果:{person}"); //查询效果:Id=1 Name=test Age=10 Sex=F result = await PutPerson(client); Console.WriteLine($"更新效果:{result}"); //更新效果:true result = await DeletePerson(client); Console.WriteLine($"删除效果:{result}"); //删除效果: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发送POST要求,Body运用Json举行序列化 .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回要求是不是实行胜利,即HTTP Code是不是为2XX } static async Task<Person> GetPerson(HttpClient client) { return await await client.GetAsync("api/Person/1") //向Person发送GET要求 .ContinueWith(x => x.Result.Content.ReadAsAsync<Person>( //猎取返回Body,并依据返回的Content-Type自动婚配格式化器反序列化Body new 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发送PUT要求,Body运用Json举行序列化 .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回要求是不是实行胜利,即HTTP Code是不是为2XX } static async Task<bool> DeletePerson(HttpClient client) { return await client.DeleteAsync("api/Person/1") //向Person发送DELETE要求 .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回要求是不是实行胜利,即HTTP Code是不是为2XX } }
这就完成了这组API的挪用,是不是是异常简朴轻易?HTTPClient运用全异步的要领,而且他有优越的扩大性,我会在以后的博客中再聊这个题目。
OK,到此为止一组简朴的Restful API和C#的挪用客户端就完成了,但这只是最先,Web API是一个很壮大的框架,他的扩大点异常丰富,这些扩大能为我们的开辟供应许多的协助,下一篇博文我将为人人带来WEB API中Filter的运用。
博文中若有不正确的处所迎接人人斧正。
以上就是ASP.NET WEB API的实用场景第一个实例 的细致内容,更多请关注ki4网别的相干文章!