[ASP.NET]谈谈REST与ASP.NET Web API
13天的假期结束,赶紧回来充电了
本节目录
Web API简介
REST
REST是“REpresentational State Transfer”的缩写,可以翻译成“表现状态转换”.
REST是一种软件架构风格,与技术无关,但是大部分基于REST风格的Web服务都是基于HTTP的
(虽然WCF在3.5以后支持REST,但是WCF太庞大了,Web API更适合做REST架构)
SOAP与REST
SOAP Web API采用RPC(面向方法Remote Procedure Call)风格,它采用面向功能的架构,所以在设计之初首先需要考虑的是提供怎样的功能。
RESTful Web API采用ROA(面向资源Resouce Oriented Architecture)架构,所以在设计之初首先需要考虑的是有哪些资源可供操作。
HTTP协议
HTTP采用简单的请求/响应模式的消息交换旨在实现针对某个Web资源的某种操作。
至于针对资源的操作类型,不外乎CRUD(Create、Retrieve、Update和Delete)而已。
一个HTTP请求除了利用URI标志目标资源之外,还需要通过HTTP方法指名针对资源的操作类型。
HTTP方法:包括GET(查)、POST(增)、PUT(改)、DELETE(删)、HEAD、OPTIONS、TRACE、CONNECTION和PATCH等
HTTP协议
GET http://neverc.cn/ HTTP/1.1
Host: neverc.cn
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.15 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie:
第1行是HTTP的3个基本属性,method,uri,vesion
其他都是HTTP的请求报头header,http定义很多原生的header,也可以添加自定义header(实际就是键值对)
除了报头,一个HTTP请求还可以包括一个请求主体内容,可以是任意格式.
与HTTP请求一样,HTTP响应也是由报头和报文2部分组成.
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 5.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 18 Sep 2015 05:39:50 GMT
Content-Length: 12003 <!DOCTYPE html>
第1行是vesion和statu(除了200 OK外,常见的有401 Not Authorized、404 Not Found)
第3行Content-Type表示媒体(或者叫资源/数据)类型.
- text/html:HTML格式的文档。
- text/xml(application/xml):XML格式的文本。
- text/json(application/json): JSON格式的文本。
- image/gif(image/jpeg、image/png):GIF(JPEG、PNG)格式的图片。
- audio/mp4(audio/mpeg、audio/vnd.wave):MP4(MPEG、WAVE)格式的音频文件。
- video/mp4(video/mpeg、video/quicktime):MP4(MPEG、QUICKTIME)格式的视频文件。
自我寄宿
建立项目
- Model:一个类库项目,定义实体
- WebApi:一个类库项目,定义API控制器(引用Model项目)
- SelfHost:一个控制台项目,寄宿API服务(引用WebApi项目)
涉及到的引用的程序集
创建实体
在Model项目中,新建一个Contact类
public class Contact
{
public string Id { get; set; }
public string Name { get; set; }
}
创建控制器
在WebApi项目中,引用System.Web.Http类库并创建API控制器
public class ContactsController : ApiController
{
#region Data
static readonly List<Contact> contacts;
static int counter = 2;
static ContactsController()
{
contacts = new List<Contact>
{
new Contact{Id = "001",Name = "张三"},
new Contact{Id = "002",Name = "李四"}
};
}
#endregion
public IEnumerable<Contact> Get(string id = null)
{
return from contact in contacts
where contact.Id == id || string.IsNullOrEmpty(id)
select contact;
}
public void Post(Contact contact)
{
//多线程并发处理
Interlocked.Increment(ref counter);
contact.Id = counter.ToString("D3");
contacts.Add(contact);
}
public void Put(Contact contact)
{
contacts.Remove(contacts.First(c => c.Id == contact.Id));
contacts.Add(contact);
}
public void Delete(string id)
{
contacts.Remove(contacts.First(c => c.Id == id));
}
}
自我寄宿
在SelfHost中,引用System.Web.Http、System.Net.Http、System.Web.Http.SelfHost类库并实现寄宿
static void Main(string[] args)
{
//对于SelfHost来说,HttpController类型的解析在默认情况下只会针对加载到当前应用程序域中的程序集列表
//通过手工加载,让该程序集加载到当前应用程序域中。
Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
var configuration = new HttpSelfHostConfiguration("http://localhost/selfhost");
using (var httpServer = new HttpSelfHostServer(configuration))
{
httpServer.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
httpServer.OpenAsync().Wait();
Console.WriteLine("寄宿Web API服务成功");
Console.Read();
}
}
测试
运行SelfHost控制台,浏览器访问http://localhost/selfhost。
注意:(由于此处会注册http.sys,所以需要管理员身份运行VS)
IIS寄宿
使用IIS寄宿非常简单,只要注册好路由数据即可
建立项目
- WebHost:一个空的Web项目(引用Model和WebApi项目)
注册路由
新建Global文件,注册HttpRoute
public class Global : HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
}
}
测试
运行WebHost项目,浏览器访问http://~/api/Contacts。
调用Web API
因为Web API是基于HTTP的,所以对于开发人员,就像普通请求网站数据一样
- jQuery
- MVVM/MVC框架的JS,AngularJS,Knockout.js
- 后台可以使用HttpClient、WebClient、HttpWebRequest等
这里演示一个HttpClient完整的例子,对于异步有疑问,可阅读我的博客:[C#] 谈谈异步编程async await
新建一个控制台项目即可,实现Program类:
static HttpClient httpClient = new HttpClient();
static void Main(string[] args)
{
//由于HttpClient类中的方法大部分为异步
//Main方法不支持Async关键字
//故新建一个方法,使其同步运行
Process();
Console.Read();
} async static void Process()
{
//获取当前联系人列表
ListContacts(); //添加新的联系人
var contact = new Contact { Name = "王五" };
await httpClient.PostAsJsonAsync("http://localhost/selfhost/api/contacts", contact);
Console.WriteLine("添加新联系人“王五”:");
ListContacts(); //修改现有的某个联系人
var response = await httpClient.GetAsync("http://localhost/selfhost/api/contacts/001");
contact = (await response.Content.ReadAsAsync<IEnumerable<Contact>>()).First();
contact.Name = "赵六";
await httpClient.PutAsJsonAsync("http://localhost/selfhost/api/contacts/001", contact);
Console.WriteLine("修改联系人“001”信息:");
ListContacts(); //删除现有的某个联系人
await httpClient.DeleteAsync("http://localhost/selfhost/api/contacts/002");
Console.WriteLine("删除联系人“002”:");
ListContacts();
} async static void ListContacts()
{
var response = await httpClient.GetAsync("http://localhost/selfhost/api/contacts");
IEnumerable<Contact> contacts = await response.Content.ReadAsAsync<IEnumerable<Contact>>();
Console.WriteLine("当前联系人列表:");
foreach (Contact contact in contacts)
{
Console.WriteLine("{0,-6}{1,-6}", contact.Id, contact.Name);
}
Console.WriteLine();
}
Web API原理
Web API借用了MVC的设计,以Controller形式定义服务,Action代表具体的操作.
Web API借助于URL路由得到控制器,再根据路由对象,通过http方法找到对应的action.(实际上,如果根据url解析不到action的时候,才会通过http方法)
路由注册
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
由于在模板中没有定义action,所以只能通过httpmethod来找action.(并且是根据方法前缀匹配即可)
通过浏览器api/Contacts查看的时候,会返回一个xml格式的数据.
实际上,webapi是先检查accept,从左到右,去匹配序列化器,如果没有匹配到则使用默认的json序列化器.
管道式设计
Web API也采用了管道式设计,这是一个不同于MVC的管道.虽然很多地方和MVC相似.
Route对象为HttpRoute
Handle对象为HttpControllerHandler(由于实现了IHttpAsyncHandler接口,所以默认走BeginProcessRequest异步方法)
扩展:
如果你的网站部署在IIS上,直接Nuget下载 Install-Package Microsoft.AspNet.WebApi.WebHost 即可使用Web API
本文地址:http://neverc.cnblogs.com/p/4603935.html
参考:http://www.cnblogs.com/artech/p/how-asp-net-web-api-works.html
[ASP.NET]谈谈REST与ASP.NET Web API的更多相关文章
- 使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目
今天,Visual Studio中没有内置工具来测试WEB API.使用浏览器,只能测试http GET请求.您需要使用Postman,SoapUI,Fiddler或Swagger等第三方工具来执行W ...
- ASP.NET MVC 提供与訪问 Web Api
ASP.NET MVC 提供与訪问 Web Api 一.提供一个 Web Api 新建一个项目.类型就选 "Web Api". 我用的是MVC5,结果生成的项目一大堆东西.还编译只 ...
- ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API
原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...
- [ASP.NET MVC 小牛之路]18 - Web API
Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建Web服务为HTTP客户端提供API.Web API 使用的基础库是和一般的MVC框架一样的,但Web API并不是MVC框架的 ...
- 使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API
Hypermedia As The Engine Of Application State (HATEOAS) HATEOAS(Hypermedia as the engine of applicat ...
- 在ASP.NET Core MVC中构建简单 Web Api
Getting Started 在 ASP.NET Core MVC 框架中,ASP.NET 团队为我们提供了一整套的用于构建一个 Web 中的各种部分所需的套件,那么有些时候我们只需要做一个简单的 ...
- 在ASP.NET Core 2.2 中创建 Web API并结合Swagger
一.创建 ASP.NET Core WebApi项目 二.添加 三. ----------------------------------------------------------- 一.创建项 ...
- 从实体框架核心开始:构建一个ASP。NET Core应用程序与Web API和代码优先开发
下载StudentApplication.Web.zip - 599.5 KB 下载StudentApplication.API.zip - 11.5 KB 介绍 在上一篇文章中,我们了解了实体框架的 ...
- 【ASP.NET Core】体验一下 Mini Web API
在上一篇水文中,老周给大伙伴们简单演示了通过 Socket 编程的方式控制 MPD (在树莓派上).按照计划,老周还想给大伙伴们演示一下使用 Web API 来封装对 MPD 控制.思路很 Easy, ...
随机推荐
- win7下虚拟机安装mac 转载自 http://itbbs.pconline.com.cn/50602805.html
最近,不断有人问起,如何在vmware下安装MAC系统.起因是以前曾发过一篇贴,在vmware8下安装MAC的方法.于是,重新下载了最新版苹果系统10.8.5,终于成功安装.现将注意事项及过程与各位朋 ...
- 面包板入门电子制作(class1)视频 全套30集高清
面包板入门电子制作(class1)套件(30集高清) 本套件以电子制作中最基础的元器件在面包板上搭建电路,用启发性的视频教学方式,使学习者熟悉电子电路基础.发挥想像力.在创新设计和制作中学会独立设计和 ...
- 更改chrome底色为护目色
找到chrome目录:C:\Documents and Settings\用户名\Local Settings\Application Data\Google\Chrome\User Data\Def ...
- IP和端口的意义
百科说明 在网络技术中,端口(Port)包括逻辑端口和物理端口两种类型.物理端口指的是物理存在的端口,如ADSL Modem.集线器.交换机.路由器上用 于连接其他网络设备的接口,如RJ-45端口.S ...
- 判断big endian和little endian的方法
http://blog.sina.com.cn/s/blog_6ab0b9a80101awzr.html 不同体系的CPU在内存中的数据存储往往存在着差异.例如,Intel的x86系列处理器将低序 ...
- Java基础集锦——利用Collections.sort方法对list排序
要想对List进行排序,可以让实体对象实现Comparable接口,重写compareTo方法即可实现按某一属性排序,但是这种写法很单一,只能按照固定的一个属性排序,没变法变化.通过下面这种方法,可以 ...
- 全渠道后端 : RFID在仓储物流中的运用
核心提示 沃尔玛的业务之所以能够迅速增长,并且成为现在非常著名的公司之一,是因为沃尔玛在节省成本以及在物流配送系统与供应链管理方面取得了巨大的成就. 最后为一个业务展望,从B端工厂提货 到C端交付的系 ...
- C8051 SMBus 原理
一.SMBus总线 SMBus串行I/O接口完全符合系统管理总线规范 1.1 版.它是一个双线的双向串行总线,与I2C串行总线兼容.系统控制器对总线的读写操作都是以字节为单位的,由SMBus接口自 ...
- Vim安装jedi-vim提示的一个错误
(仅为了提醒自己) 第一次的安装方法好像是通过 bundle安装的,好像是通过这个安装的并不是最新的版本,然后删除了通过下面的方法,最重要的是要执行 git submodule update --in ...
- 使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
360度的全景图片效果常常可以用到给客户做产品展示,今天这里我们推荐一个非常不错的来自Robert Pataki的360全景幻灯实现教程,这里教程中将使用javascript来打造一个超酷的全景幻灯实 ...