REST风格的服务
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html
前言
经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了。在正式开始之前,再一次回顾一下Web Api的应用场景:Web Api可以与 MVC,WebForm结合使用,也可以作为一个单独的Web服务。在正式讨论Web Api的配置以及如何构造我们的URI来消费资源之前,我们必须理解Http方法与我们将要访问的资源之间的关系。举个简单的例子,我们把模型”Course”作为我们访问的资源,下面就列举了访问这个资源的http方法:
Action | HTTP Verb | Relative URI |
获取所有课程信息 | GET | /api/courses |
根据某个Id获取单个课程 | GET | /api/courses/id |
新增一个课程 | POST | /api/coursesNew course is sent in POST body |
更新一个课程 | PUT or PATCH | /api/courses/idUpdated course is sent in POST body |
删除一个课程 | DELETE | /api/courses/id |
第一步:创建Web Api项目
右击解决方案->添加新建项目
下一步:
点击确定
第二步:配置第一个路由
在创建好项目之后,我们可以在App_Start文件夹下看到“WebApiConfig”类。这个类就是用来配置路由信息的,这个类最终会在“Global.asax”的Application_Start()方法中被调用,后面我们会在这个这个类里面配置多条路由信息。
配置第一个路由:
config.Routes.MapHttpRoute(
name: "Courses",
routeTemplate: "api/courses/{id}",
defaults: new {controller="courses", id = RouteParameter.Optional }
);
分析一下上面这段代码:我们创建了一个Courses的路由规则,这个路由模板会匹配到“api/courses/{id}”的URI,在这个模板定义了2个默认值(api,courses)以及一个可选值(id)。对于“/api/courses or /api/courses/5”URI就会被我们的路由模板匹配到,同时“/api/courses”URI也会被匹配到,因为Id是可选的。
第三步:添加第一个控制器(courses controller)
Web Api中的Controller是用来处理客户端Http请求的(与MVC中的Controller类似),首先,创建Controller——右击Controller文件夹->新建项->控制器
然后出现下面窗口:
选择Web API 2控制器-空,并命名为CoursesController。然后确定
打开刚才创建的Controller,可以看到我们创建的类继承自“ApiController”。同时对于这个类的类名必须是“CoursesController”,因为在Web Api中默认的控制器选择方式是寻找所有继承自“ApiController”类并且这个类是以“Courses”开头(这是在我们的路由规则中配置的)的控制器。
第四步:在Controller中添加Action
首先,我们创建上述表格列举到的前2个方法(GetAllCourses,GetCourseById)
方法的选择是智能的,如果我们创建了2个方法Get()和GetCourse(int id),假设我们发送一个GET请求并且URI是“/api/courses/5”,那么“GetCourse(int id)”方法就会被选择执行,这是因为方法是以Get开头而且URI中包含Id的值。这种选择方式同样适用以其他的Http方法(put,delete,post),下面上代码:

public class CoursesController : ApiController
{
public List<Course> Get()
{
ILearningRepository repository = new LearningRepository(new LearningContext()); return repository.GetAllCourses().ToList();
} public Course GetCourse(int id)
{
ILearningRepository repository = new LearningRepository(new LearningContext()); return repository.GetCourse(id);
}
}

当我们创建一个Get请求并且URI是“http://localhost:{your_port}/api/courses”时候,Get()方法会被选择调用,下面是相应的部分代码:

[
{
"Id": 1,
"Name": "History Teaching Methods 1",
"Duration": 3,
"Description": "The course will talk in depth about: History Teaching Methods 1",
"CourseTutor": {
"Courses": [],
"Id": 1,
"Email": "Ahmad.Joudeh@outlook.com",
"UserName": "AhmadJoudeh",
"Password": "SWDQNPSE",
"FirstName": "Ahmad",
"LastName": "Joudeh",
"Gender": 0
},
"CourseSubject": {
"Courses": [],
"Id": 1,
"Name": "History"
},
"Enrollments": []
},
{
"Id": 2,
"Name": "History Teaching Methods 2",
"Duration": 3,
"Description": "The course will talk in depth about: History Teaching Methods 2",
"CourseTutor": {
"Courses": [],
"Id": 1,
"Email": "Ahmad.Joudeh@outlook.com",
"UserName": "AhmadJoudeh",
"Password": "SWDQNPSE",
"FirstName": "Ahmad",
"LastName": "Joudeh",
"Gender": 0
},
"CourseSubject": {
"Courses": [],
"Id": 1,
"Name": "History"
},
"Enrollments": []
},

如果你发送一个Get请求并且URI是“http://localhost:{your_port}/api/courses/5”。那么GetCourse(int id)将会被选择调用执行。但是很遗憾在调用这个方法之后就会产生一个异常,这个异常信息简单来说就是“序列化对象的时候出现了循环依赖”,换句话说就是对象间循环引用(Course>Enrollment>Course>Enrollment>etc…)
总结
到目前为止我们已经让Web Api跑起来了,但仍然有很多不足之处:
返回对象时出现循环依赖,可以通过模型工厂模式解决。
我们返回了领域模型中所有的字段给客户端,然而有一些敏感信息不应该返回(例如:password字段),解决方案:模型工厂模式
每一个返回给客户端的资源都应该包含一个URI以便客户端查询,解决方案依旧是模型工厂模式。
对于返回单个资源,我们应当返回相应的状态码(例如:成功200,资源未找到404等),解决方案:HttpResponseMessage对象
在每个方法里我们都实例化了一个repository,这个对象包含了一些昂贵的操作(例如:数据库连接),解决方案:依赖注入模式
对于返回的Json对象格式是以“帕斯卡”风格的(例如“FirstName”),然而我们的Api有很大的可能被带有Javascript的客户端消费,对于JS开发者来说可能更适合“驼峰”风格(例如”firstName”)的数据。解决方案:配置Json格式。
ok,下一章我们就着重解决上述的问题
本章代码:http://yun.baidu.com/share/link?shareid=2010367762&uk=17559114&third=0
写这篇随笔的主要原因是想保存一些有价值的东西,不想看完就去丢弃,算是对自己点点滴滴的记录,也为下次自己所需做好准备。希望这些能为那些正在努力拼搏的同胞们做出一丁点贡献。
一、highcharts插件。
主要用作制表,对于按时间统计资料非常有效,并且具有美观的外表,代码简单易于修改(需要英文基础),我认为非常值得推崇。http://www.highcharts.com/
二、angularJS插件。
AngularJS是Google开源的一款JavaScript MVC框架,不但能减少代码量还能很好的复用(我现在正在研究),里面有入门教程、一些好的文章、视频等等,非常值得拥有。http://www.iteye.com/news/28651-AngularJS-Google-resource
三、seaJs插件。
我大概了解过,没有去专门去研究过,大家可以去尝试应用,它口碑比较不错。http://seajs.org/docs/#docs
四、父文本编辑器。
里面有几款编辑器,看个人喜欢,个人比较推荐YUI 2,简单便于修改,除了在firefox中调节字体只是在边距改变而不改变字体大小外。http://www.iteye.com/news/28482-5-free-rich-text-editor
五、15款响应式设计前端框架推荐。
个人比较喜欢pocketgrid,简单好用,兼容性比较好,除了不兼容万恶的ie6,其他基本没问题。http://www.iteye.com/news/28501-15-new-responsive-frameworks
六、Jasmine插件。
对此一知半解,主要用于单元测试,我觉得以后我应该用得着。http://www.36ria.com/4457
七、jquery动画特效。
里面有很多例子,想多学点动画效果的可以去找个网站看看(看别人动画效果,然后用自己的方式实现,最终对比两者不同之处。不但能提升自己还能打发时间,一箭双雕!)。http://www.5icool.org/
七、ie6下png24恢复透明度。
这款插件也是非常好用,只需引入htc文件和js文件即可(js文件在需要图片定位时引入),http://www.twinhelix.com/css/iepngfix/
最后再推荐几本书吧,我认为基础不扎实的可以去看下,《锋利的Jquery》、《HTML5从入门到精通》和《大话设计模式》。我是菜鸟,尽自己最大努力去实现自己的价值,希望这些能对大家有一点点用,也希望在今后的日子能和大家一起去努力去拼搏!我相信事在人为,只要有恒心,铁锤磨成针,加油!
REST风格的服务的更多相关文章
- Rest风格WEB服务(Rest Style Web Service)的真相
http://blog.csdn.net/jia20003/article/details/8365585 Rest风格WEB服务(Rest Style Web Service)的真相 分类: J2E ...
- ASP.NET Web Api构建基于REST风格的服务实战系列教程
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[十]——使用CacheCow和ETag缓存资源 系列导航地址http://www.cnblogs.com/fzrain/p/3 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- cxf和spring结合,发布restFull风格的服务
rest(Representational State Transfer):表现层状态转化,它是一种风格,用于资源定位,例如:http://ip:port/user/student/001 和资源操作 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了.在正式开 ...
- springMVC+json构建restful风格的服务
首先.要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描写叙述了一个架构样式的网络系统.比方 web 应 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【四】——实现模型工厂,依赖注入以及格式配置
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在上一篇中,我们已经初步开始使用Web Api了,但同时出现了一些很多不足之处,本章我们就着 ...
- 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 使用Entity Framework Code First模式构建数据库对象 已经决定使用EF C ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在数据访问层应用Repository模式来隔离对领域对象的细节操作是很有意义的.它位于映射层 ...
随机推荐
- wikioi 1002 旁路
意甲冠军:这个问题刚开始的问题,有错误的含义,原桥始建于一条直线.无论多么遥远. 思维:dfs寻求答案的第一个问题.然后做最小生成树,双方不能大桥将设置INF即可了.然后假设用到INF的边就加上0即可 ...
- Codeforces 490F. Treeland Tour 暴力+LIS
枚举根+dfs 它可以活 , 我不知道有什么解决的办法是积极的 ...... F. Treeland Tour time limit per test 5 seconds memory limit p ...
- 微信公众平台企业号验证接口、回调 PHP版
微信公众平台企业号验证接口.回调 PHP版,本人为了解决这个企业号的验证和发送消息的问题,整整研究了几天时间,由于微信企业号刚推出来,网上资料太少了!后来在一些朋友的帮助下和本人重复调试完好下,最终整 ...
- Java有用的经验--Swing片
Java有用经验总结--Swing篇 前言 本文前言部分为我的一些感想,假设你仅仅对本文介绍的Java有用技巧感兴趣,能够跳过前言直接看正文的内容. 本文的写作动机来源于近期接给人家帮忙写的一个小程序 ...
- Tomcat剖析(二):一个简单的Servlet服务器
Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...
- .NET Framework 各版本区别
.NET Framework 各版本区别 .NET Framework 1.1 自1.0版本以来的改进:自带了对mobile asp .net控件的支持.这在1.0版本是以附加功能方式实现的,现在已经 ...
- Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...
- UITableView刷新局部
//局部section刷新 NSIndexSet *nd = [[NSIndexSet alloc] initWithIndex:1]; //刷新第二个section [self.tableView ...
- SQL表连接
背景 在上次的自考科目<数据库系统原理>中.已经接触到了关于数据库表连接的一些知识,近期的学习过程中又用到了关于数据库表的连接问题,趁此再跟大家一起回想一下. 导图总结 首先用一张思维导图 ...
- 浙江大学PAT考试1009~1012(1010上帝是冠军。。)
哎,pat1010即使java书面,只有java书面,还增加了两个点,,.啊,智商捉佳,主要pat有些不给明确的范围.造成遐想空间.. 还是按顺序介绍.. 题目地址:http://pat.zju.ed ...