ASP.NET MVC中RESTful原教旨主义者的两个实现细节
2016-03-10 11:09
609 查看
刚才无意中看到《什么是REST?》一文。文章虽然很短,短到我几乎要鄙夷一下作者的程度,但是仔细看了下,确也发现本文着实有用。
作为一名想尽量实现纯RESTful服务的人(或可称为RESTful原教旨主义者)来说,希望做出来的服务能尽量的符合RESTful原则定义,如果做出来一个RPC + ROA(面向资源的架构,其定义见《RESTful Web Services 中文版》)的服务,那还不如直接使用WCF算了,虽然,罗马不是一天建成的,我也不可能一上手就构建一个纯RESTful服务,但是尽量向标准靠拢还是很有必要的。
文中提到了一些概念,我很快发现在我的实践中有两条不符合。
其一:“REST式的Web Service使用HTTP里的方法:GET, POST, DELETE, PUT。你不需要使用URL或请求的内容来指定这个方法。”
而在我目前的做法中,我是使用了类似这样的Url:http://www.cleversoft.com/svc/log/create作为创建一条日志记录的url的,很明显,在这个Url中,create是不必要的,甚至也是不应该出现的,为什么呢,RESTful的原则之一:统一接口原则,为啥具有这个原则呢,统一接口的目的是建立一种面向程序的网站,既然是面向程序的,大家都严格的尊重约定便是一个十分重要的事情了,否则你开放了一个资源,如:http://www.anywhere.com/blog,(实际上这个资源甚至可以称为API了)别人怎么知道后面是Get还是Search才能调用呢?但是运用了统一接口原则,大家很自然就想到使用GET(Http
Method)来获取数据了,这就在很大程度上简化了MetaData的定义。回到我的应用中来说,对于Log服务来说,http://www.cleversoft.com/svc/log/已经很明确的代码了Log服务(资源的表示),使用POST方法就代表是创建日志记录了,画蛇添足的加上一个Create,不是又回到RPC方式了么?
按照ASP.NET MVC的Route规则来说,想要客户端使用http://www.cleversoft.com/svc/log的方式来调用到一个POST的方法,最简单直接的方法便是创建一个方法
但是..这似乎也太锉了点吧,明明一个Create方法,使用Index..客户端爽了,服务器端的人该骂娘了吧,还是继续使用Create方法名称为好,代码可读性也是至上的啊。那就只能从Url Routing上想办法了,结果很快发现了一个类型HttpMethodConstraint,哈哈,看起来就是为这件事准备的吧,于是为Url Routing添加新实例,如下代码所示:
将客户端Url中的Create删除,使用http://www.cleversoft.com/svc/log添加Log记录,成功!
下面说说其二,第2个相对来说更简单点。文中提到“REST式的Web Service使用HTTP状态码作为返回值。”,我看Google中的服务,很多都是返回被创建(修改)的实体的,这我倒不愿意,我向服务器发了什么我还不知道么,这一来一回的多浪费啊,所以我就返回了new EmptyResult(),当然,返回EmptyResult应该就是返回一个200(Http StatusCode)吧,但是对于Create,Update,Delete来说,都返回200似乎显的不那么专业,于是对之前我做的HttpStatusResult稍作改动,为Controller添加几个扩展方法:
这样,就可以视情况向客户端如实反映操作结果了,万一以后有人使用别的客户端调我的服务,也不至于骂我NC了,呵呵
使用方法示例:
作为一名想尽量实现纯RESTful服务的人(或可称为RESTful原教旨主义者)来说,希望做出来的服务能尽量的符合RESTful原则定义,如果做出来一个RPC + ROA(面向资源的架构,其定义见《RESTful Web Services 中文版》)的服务,那还不如直接使用WCF算了,虽然,罗马不是一天建成的,我也不可能一上手就构建一个纯RESTful服务,但是尽量向标准靠拢还是很有必要的。
文中提到了一些概念,我很快发现在我的实践中有两条不符合。
其一:“REST式的Web Service使用HTTP里的方法:GET, POST, DELETE, PUT。你不需要使用URL或请求的内容来指定这个方法。”
而在我目前的做法中,我是使用了类似这样的Url:http://www.cleversoft.com/svc/log/create作为创建一条日志记录的url的,很明显,在这个Url中,create是不必要的,甚至也是不应该出现的,为什么呢,RESTful的原则之一:统一接口原则,为啥具有这个原则呢,统一接口的目的是建立一种面向程序的网站,既然是面向程序的,大家都严格的尊重约定便是一个十分重要的事情了,否则你开放了一个资源,如:http://www.anywhere.com/blog,(实际上这个资源甚至可以称为API了)别人怎么知道后面是Get还是Search才能调用呢?但是运用了统一接口原则,大家很自然就想到使用GET(Http
Method)来获取数据了,这就在很大程度上简化了MetaData的定义。回到我的应用中来说,对于Log服务来说,http://www.cleversoft.com/svc/log/已经很明确的代码了Log服务(资源的表示),使用POST方法就代表是创建日志记录了,画蛇添足的加上一个Create,不是又回到RPC方式了么?
按照ASP.NET MVC的Route规则来说,想要客户端使用http://www.cleversoft.com/svc/log的方式来调用到一个POST的方法,最简单直接的方法便是创建一个方法
下面说说其二,第2个相对来说更简单点。文中提到“REST式的Web Service使用HTTP状态码作为返回值。”,我看Google中的服务,很多都是返回被创建(修改)的实体的,这我倒不愿意,我向服务器发了什么我还不知道么,这一来一回的多浪费啊,所以我就返回了new EmptyResult(),当然,返回EmptyResult应该就是返回一个200(Http StatusCode)吧,但是对于Create,Update,Delete来说,都返回200似乎显的不那么专业,于是对之前我做的HttpStatusResult稍作改动,为Controller添加几个扩展方法:
使用方法示例:
相关文章推荐
- asp.net AspNetPager Repeater PagedDataSource 假分页方法适用于小数据量分页
- iReport+JasperReport实现数据库记录导出到pdf文档
- ASP.NET的三层架构(DAL,BLL,UI)
- ASP.NET学习资料
- asp.net框架
- 【项目异常】nested exception is java.lang.NoClassDefFoundError: org/aspectj/util
- aspectjrt 面向切面,拦截返回值,并修改返回值
- Spring学习笔记十四---AspectJ前置通知后置通知
- Spring学习笔记十四---AspectJ返回通知,异常通知,环绕通知
- Spring学习笔记十四--Aspect切面优先级
- Spring学习笔记十四--AspectJ重用切点表达式
- 七天学会ASP.NET MVC(1-3)源代码下载
- asp.net 防止SQL注入攻击
- ASP Girdview通过ButtonField获取行号与主键
- 用asp.net c# HttpWebRequest获取网页源代码
- ASP.NET MVC5 视图预编译
- Asp.Net MVC EF各版本区别
- casperjs在windows下抓取元素乱码
- 树莓派折腾录一. 必要的初始化(Raspberry Pi 2 model B + raspbian jessie)
- ASP.NET验证控件详解