REST 深度解析:超媒体

今天,人们对REST的认识仅局限于漂亮的URI和CRUD操作,却忽视了RESTful系统的其他强大特性,如松耦合和自描述。本次演讲将讨论REST 中最难以被人理解的部分:HATEOAS(超媒体即应用状态引擎)或超媒体约束。超媒体是RESTful服务最重要的特点。非RESTful服务会迫使消 费者和服务之间的紧密耦合,而拥抱超媒体格式的RESTful服务则不会如此。换用超媒体感知的服务向消费者描述携带业务内容的业务协议,可以允许这些协 议独立于业务挑.

http://wenku.baidu.com/view/ef33661252d380eb62946d5c.html#

 

    • REST

      表述性状态转移(Representational State Transfer,REST),不是一种标准,而是一种软件架构风格。

      基于REST的服务与基于SOAP的服务相比,性能、效率和易用性上都更高,而SOAP协议非常的复杂和不透明。REST受到越来越多的Web服务供应商欢迎。目前大部分供应商,如yahoogoogleAmazon等都提供REST风格的服务。

 

      REST的主要原则是:

 1.网络上的所有事物都可被抽象为资源;

 2.每个资源都有一个唯一的资源标识符URI;

 3.使用标准方法操作资源;

 4.所有的操作都是无状态的;

 5.通过缓存来提高性能。

  

    REST是基于Http协议的,任何对资源的操作行为都是通过Http协议来实现。Http把对一个资源的操作限制在4个方法以内:GET、POST、PUTDELETE,这正是对资源CRUD操作的实现。

    REST的资源表述形式可以是XMLHTMLJSON,或者其他任意的形式,这取决于服务提供商和消费服务的用户。

     

    但是REST不是万能的。操作无状态也会带来巨大的安全问题,如何授权和验证用户?如果要求每次请求都包含完整的身份和验证信息,又如何避免信息泄漏?复杂的功能挑战架构的易用性,这就需要在性能与功能间权衡,究竟该用REST还是SOAP。

  

    • WebHttpBinding

      WebHttpBinding允许开发人员通过 HTTP 请求(这些请求使用“Plain old XML”(POX) 样式消息,而不是使用基于 SOAP 的消息)来公开 Web 服务,可以很便利的实现REST

      与其他绑定不同的是:必须使用WebHttpBehavior对服务的终结点进行配置。还要求使用WebGetAttributeWebInvokeAttribute属性将各个服务操作映射到 URI,同时定义调用和返回结果的消息格式。

       

    • 服务契约

      先定义服务契约。

      这里提供两个方法,分别采用GETPOST方式访问。

      我们可以看到,与普通WCF服务契约不同的是,需要额外用WebGet或者WebInvoke指定REST访问的方式。另外还要指定消息包装样式和消息格式,默认的消息请求和响应格式为XML,若选择JSON需要显式声明。 
       UriTemplate用来将方法映射到具体的Uri上,但如果不指定映射,将映射到默认的Uri。比如采用Get访问的GetUser方法,默认映射是:/GetUser?Name={Name}&Position={Position}。
 
IContract

     

    • 服务端

      这里最简单的实现GetUserCreateUser两个方法的逻辑,关注点不在这里。

 

Service类

   

     服务端的配置文件中只有一个特别处,必须使用WebHttpBehavior对服务的终结点进行配置。

   

Web.Config

 

    • 客户端

     为了强调REST的通用性,客户端不用WCF的形式调用服务,而是用另外两种通用的方式:

     一是用C#编程直接HTTP访问,消息格式我们选XML

       二是用jquery实现GETPOST访问,消息格式我们选JSON。

 

       先实现C#方式,我们封装一个Client类,实现HTTP的GET和POST方式。

 

Client类

 

      下面是主函数,按顺序调用两个接口,并显示返回值。需要注意XML约定的命名空间:

 

Client Main函数

     

      结果:

REST 深度解析:超媒体_第1张图片

     

      接下来实现javascript方式。

      这里采用jquery访问REST服务,为了javascript操作数据的便利,消息格式选择JSON,可以忽略数据契约的命名空间。不过需要服务契约做一点修改,显式指定请求或响应消息的格式,例如: 

  • [WebInvoke(Method ="POST", UriTemplate ="User/Create", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]

   

      Html代码: 

js client代码

     

       结果:

 
分类:  WCF
标签:  WCF.netC#XMLRESTJavascript

WCF

 
摘要: REST 表述性状态转移(Representational State Transfer,REST),不是一种标准,而是一种软件架构风格。 基于REST的服务与基于SOAP的服务相比,性能、效率和易用性上都更高,而SOAP协议非常的复杂和不透明。REST受到越来越多的Web服务供应商欢迎。目前大部分供应商,如yahoo、google、Amazon等都提供REST风格的服务。 REST的主要原则是:1.网络上的所有事物都可被抽象为资源;2.每个资源都有一个唯一的资源标识符URI;3.使用标准方法操作资源;4.所有的操作都是无状态的;5.通过缓存来提高性能。REST是基于Http协议的,任何对资源 阅读全文
posted @  2011-01-13 14:33 reni 阅读(6410) |  评论 (86)  编辑
 
摘要: WSFederationHttpBinding支持 WS-Federation 协议的绑定。 WS-Federation 规范定义了一个模型和消息集合,用于在不同信任领域间代理信任并联合身份和身份验证信息。协议被BEA、IBM、Microsoft、RSA Security 和 VeriSign厂商支持。 WS-Federation 依赖另外一组协议:WS-Trust, WS-Policy,WS-Authorization。WCF契约Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHi 阅读全文
posted @  2010-11-24 09:31 reni 阅读(382) |  评论 (1)  编辑
 
摘要: Client端 只要按约定的方式访问发布的WCF服务,并提供相应的用户信息,就可以获得IP/STS颁发的令牌。 可以直接添加对STS服务的引用,按普通的WCF访问来处理,但因为利用Geneva框架实现的STS的服务契约是比较底层,消息契约是采用通信单元Message类,就需要客户端进行进一步处理,才能得到安全令牌的实体。 下面是服务契约,按WS-Trust标准约定的语法,方法参数中封装了RST,返回值中封装了RSTS。可以在这里对底层消息直接处理。IContract Geneva框架也提供了访问STS的客户端类WSTrustClient,对基础的WCF进行了封装。 我这里利用框架现成的客户端类 阅读全文
posted @  2010-11-22 16:18 reni 阅读(389) |  评论 (1)  编辑
 
摘要: WS-Trust 安全令牌服务 (STS) 是基于 WS-Trust协议构建、签署和颁发安全令牌的服务组件,可处理不同类型凭据的身份验证。 WS-Trust是WS-*规范族中的一员,也是OASIS其中的一项标准,专门处理有关安全tokens的发布,更新和验证,确保各方参与者的互操作处在一个可信任的安全数据交换环境中。 从较高层次看,WS-Trust使用四种服务操作来描述一个约定:颁发、验证、续订和取消。客户端分别调用这些操作来请求安全令牌、验证安全令牌、续订已过期的安全令牌以及取消不应再继续使用的安全令牌。WS-Trust规范定义了每个操作的语法: 请求安全性令牌时:使用 WS-Trust 规 阅读全文
posted @  2010-11-18 17:11 reni 阅读(432) |  评论 (1) 

WCF REST 工作总结(一)

最近工作中学习使用了WCF REST,REST 有很多好处 高效 简约  面向资源  而客户端调用 也变得非常简单。REST 入门的资料等 大家可以去网上找 这里主要分享下遇到的问题以及解决~

一.环境准备

使用WCF REST 可以先下载一个模版 并大致预览

REST 深度解析:超媒体_第2张图片

下载好这个模版后  新建项目 选择这个模版 会默认帮我们生成一个 CRUD 的代码  新手朋友可以用这个快速熟悉下REST风格的WCF.

这这里还给我们提供了一个很方便的功能 help  只需在我们的服务后面 加上help 就能显示服务的详情与介绍了

REST 深度解析:超媒体_第3张图片

REST 深度解析:超媒体_第4张图片

二.搭建REST WCF服务

1.接口的实现

REST 深度解析:超媒体_第5张图片

当我们的请求为 Get时  一般用来获取数据时  使用[WebGet]  而 增加 修改 删除 则使用[WebInvoke]  里面的Method 来决定使用POST 或PUT等 这里要注意下

Method 里的一定要为大写  POST PUT等  否则会出现 HTTP 错误 405 405 不允许此方法 对于请求所标识的资源,不允许使用请求行中所指定的方法。

我们在这里 还可以通过 ResponseFormat 与 RequestFormat 来指定接受的参数与返回的参数格式

2.类继承接口 这里先贴一部分 最基础的CRUD

REST 深度解析:超媒体_第6张图片

REST 深度解析:超媒体_第7张图片

3. Global 里注册路由

REST 深度解析:超媒体_第8张图片

用过mvc的朋友  是不是发现这样写完后 非常的像mvc呢~

三.实现调用服务

  1.实现get 服务

   很简单  我们可以直接通过浏览器 输入 http://localhost:55914/ITaskService/Tasks/State/1    即可获得state为1的所有数据  以json格式传输过来

  rest 风格的wcf  使得我们不用再像以前一样 客户端 添加 服务引用了  没有了wsdl  简洁了许多 效率也提高了很多  使得我们访问更容易

  REST 由于没有了代理   而是发送请求   我们的客户端可以是 js 访问    如果是 jquery  只需$.get  即可发送请求   这里我主要说下C#的访问方式 

  通过WebClient 方式  这个类封装的比较好  调用起来简单  但由于封装的过多 实现一些功能时则不太容易

  通过WebRequest方式 这个则比较灵活

  上面两个是经常用到的两个类 这里再推荐给大家一个 是wcf工具里的其中一个 专门用来访问 rest 服务 也非常的简单

  通过HttpClient 这个也是微软开发的工具类  而且在最新的 .net 4.5里 集成了进去

  通过上面三个任意其中一个就可以实现提交了

  但是 这里有一个问题 我们以前有代理类  通过调用方法 得到代理类 可是现在呢  我们没有类  我们得到的是一串json 格式的数据 我们怎么把他变成像类一样的 方便操作呢?

  比如 A公司发布了rest wcf服务 数据格式 json    公司B 要调用A公司的服务   以前ws 或wcf都有代理  可以生成代理类  现在却得到的是json数据 而我们还没有要反序列化的实体类

  比如 我现在想把得到的数据 像表格一样的展示出来 

  有两种方法

  1.对照json数据  客户端新建个类 然后通过反序列化  把json 反序列化为类对象  

   这样比较麻烦 类少还可以  要是多了 则需要新建很多实体类   更关键的是 服务端的实体类 更新了  以前WCF或ws 更新下服务即可 而现在 还要更新客户端实体类岂不是很麻烦?

   所以推荐用下面的方法

  2.将json 反序列话为 dynamic 类型 

    json 转换为dynamic 类型   起初 我用的是 第三方的 json.net  经过尝试 发现再把json 转换为集合类型时 总是出错  如果有朋友知道怎么弄 还望告知下

    后来经过尝试 我采用了 微软自带的 JavaScriptSerializer  下面展示代码

  

REST 深度解析:超媒体_第9张图片

 使用方法很简单 经过  不论是序列化 集合 还是单个的  都没有问题 这个时间也会正常显示 没有问题~  结果上面的代码  就可以把接受的json 类型 展示为一个 table了

 好了 这个问题解决了 可以上三种方式发送get请求了 这个毕竟简单 大家直接看代码 

REST 深度解析:超媒体_第10张图片

可以看到 第一个 和第三个 都是非常简单的  这里要注意的是  要注意编码问题 因为传递的有中文 会有乱码问题

所以要注意编码问题  再第二个里 可以通过得到response.ContentType 先得到编码  这样就可以自动识别编码格式了

再说下HttpClient  这个真正发送请求  是在 message.EnsureStatusIsSuccessful();  这句话

通过上面任意一种方法 我们都可以得到json  这样再通过将json 反序列话为 dynamic 类型 就可以像有实体类一样简单的操作了~~

今天先写到这 

下面讲post 等提交数据 以及 原生流文件的上传 下载 等

最后 祝大家周末愉快 欢迎一起交流技术

参考:

http://blog.csdn.net/fangxinggood/article/details/6235662

原文:

http://www.cnblogs.com/wlflovenet/archive/2011/10/28/WCFREST.html

分类:  WCF
WCF
 
WCF REST 工作总结(二)
摘要: 1.使用WCF REST不在享有生成的代理类,采用 dynamic 与json相互转换 2.使用webclient ,webRequest,微软提供的WCF 工具 HttpClient 分别使用三种方法访问 3.普通的CRUD以及流文件的上传下载 4.Session与cookie 阅读全文
posted @  2011-10-30 11:09 wlf 阅读(2274) |  评论 (30)  编辑
 
WCF REST 工作总结(一)
摘要: 1.使用WCF REST不在享有生成的代理类,采用 dynamic 与json相互转换 2.使用webclient ,webRequest,微软提供的WCF 工具 HttpClient 分别使用三种方法访问 3.普通的CRUD以及流文件的上传下载 4.安全问题与异常处理 5.Cookie缓存 阅读全文

 

你可能感兴趣的:(JavaScript,.net,xml,C#,REST,WCF)