RESTful Web Services 详解

RESTfulWeb Services是一种基于互联网的架构风格,它允许用户通过选择链接来浏览Web应用程序。REST基于资源,这些资源通过唯一的URI来标识。当一个服务遵循REST的标准或特性时,就可以称这个服务是RESTful的。REST不依赖于任何特定的平台,但目前主要在Web上通过HTTP实现。

REST的基本特性/约束

客户端-服务器分离:关注点分离原则,用户界面与数据存储分离,这有助于用户界面在多个平台上的可移植性,并通过简化服务器组件来提高可扩展性。

无状态:每个对服务器的请求都应该包含所有必要的信息,以便理解并完成该请求。

可缓存:响应请求的数据应该是可缓存/不可缓存的,以便客户端在其他时间点使用。这可能会提高性能并减少网络流量。

分层系统:可以使用中介服务器(如代理服务器或缓存服务器)来提高性能或引入安全性

统一接口:应使用统一的接口(如HTTPGET、POST、DELETE、PUT)来访问资源。

RESTfulWeb Service的组成

URI统一资源标识符 - 这是在网络中识别资源的唯一方式。网络上的每个资源都被赋予了一个唯一的标识符 - 一个通用标识符(例如URL)。所有Web浏览器、服务器、应用程序都理解这个标识符,这使得它们之间可以轻松地连接和交换信息,而不会出现问题。

MIME类型:可以是XML、HTML和JSON。

HTTP方法:HTTP是与Web资源通信的标准方式。GET、PUT、DELETE、POST是一些常见的访问资源的方法。

GET:用于请求资源的特定表示。

PUT:用特定表示更新资源。

DELETE:删除指定的资源。

POST:创建新资源。

设计RESTful服务

设计基于REST的服务的初始步骤是确定将暴露给外部世界的资源对象,然后将这些资源映射到URI。不应该专注于设计应用程序的方法;相反,应该专注于设计资源及其URI。REST可以使用各种数据格式,但XML更简单且最常用,但JSON同样被广泛使用。

.NET 4和REST以及WCF

WCF不仅仅是构建SOAP基础服务,它是一个可扩展的框架,具有通用的编程模型和完全可插拔的通信基础设施。WCF运行时的基本工作是监听来自网络位置的消息,并处理这些消息,然后将它们传递给应用程序(服务)。有了.NET 4,开发REST应用程序变得容易。微软提供了一个REST模板,可以用来创建新项目,这将创建REST的基本骨架代码。

从VS 2010开始,创建一个新项目,选择在线模板,并选择WCF。会显示各种选项,选择"WCF REST Service Template 40"。创建一个返回员工详细信息集合的类。使用属性[WebGet()]标记想要调用的方法。

[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class Service1 { // TODO: Implement the collection resource that will contain the SampleItem instances [WebGet(UriTemplate = "")] public IList GetEmployeeDetail() { IList employeeDetail = new List(); EmployeeDetail empDetail1 = new EmployeeDetail(); empDetail1.EmployeeIdentifier = 123; empDetail1.EmployeeName = "Test1"; empDetail1.ProjectName = "NE"; employeeDetail.Add(empDetail1); EmployeeDetail empDetail2 = new EmployeeDetail(); empDetail2.EmployeeIdentifier = 1234; empDetail2.EmployeeName = "Test2"; empDetail2.ProjectName = "NE"; employeeDetail.Add(empDetail2); return employeeDetail; } } public class EmployeeDetail { private string employeeName; private int employeeId; private string projectName; public int EmployeeIdentifier { get { return employeeId; } set { employeeId = value; } } public string EmployeeName { get { return employeeName; } set { employeeName = value; } } public string ProjectName { get { return projectName; } set { projectName = value; } } }

构建并运行代码。现在访问URL http://localhost:8422/Service1/ 。服务返回以下XML:

<ArrayOfEmployeeDetail xmlns="http://schemas.datacontract.org/2004/07/WcfRestService2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <EmployeeDetail> <EmployeeIdentifier>123</EmployeeIdentifier> <EmployeeName>Test1</EmployeeName> <ProjectName>NE</ProjectName> </EmployeeDetail> <EmployeeDetail> <EmployeeIdentifier>1234</EmployeeIdentifier> <EmployeeName>Test2</EmployeeName> <ProjectName>NE</ProjectName> </EmployeeDetail> </ArrayOfEmployeeDetail>

REST的安全性

如果查看上面的代码,会注意到这个服务没有内置任何安全方面。但是,当构建暴露端点的服务时,应该考虑安全方面。RESTful服务只是HTTP端点,所以所有与HTTP(如HTTPS、证书)一起实现的安全性也可以与REST一起实现。

有两种类型的托管服务:自托管Web服务和与应用程序服务器(如IIS)一起托管的Web服务。在自托管Web服务中,大部分安全方面应该在代码中处理;另一方面,在IIS中托管时,IIS的设置负责安全性。

端点的安全性由WebHttpBinding的Security属性设置。Security属性是WebHttpSecurity类型,用于确定绑定所需的安全模式以及它需要的客户端凭据类型。WebHttpSecurity有两个属性:Mode(WebSecurityHttpMode类型)和Transport(HttpTransportSecurity类型)。可以使用WebHttpSecurityMode指定三种安全级别:

无、传输、传输凭据仅

WebHttpBinding.Security.Transport是HttpTransportSecurity类型,有助于验证客户端。它有这三个属性:

ClientCredentialType(HttpClientCredentialType类型)、ProxyCredentialType(HttpProxyCredentialType类型)、Releam(字符串)。HttpClientCredentialType的值可以是以下之一:无、基本、摘要、NTLM、Windows、证书。

当在IIS上托管端点时,使用web.config文件进行配置更改。可以为服务运行的虚拟目录进行配置。需要了解客户端配置和虚拟目录配置。

一旦认证,下一步就是授权客户端,他们可以做什么,不可以做什么。

模拟:通过模拟客户端,将授权委托给另一层。例如,当客户端尝试在SQL Server数据库中插入或更新数据时,如果客户端没有权限,SQL Server会抛出异常,这可以回传给客户端。

基于角色:通过限制对某些Windows用户或组的操作来实现授权。

REST的优势

与其它风格的服务相比,REST风格的服务提供更容易被消费,意味着消费者学习曲线更低。

支持服务URI的缓存。

组件可以独立部署。

轻量级(考虑SOAP,它使用WSDL,使SOAP协议成为复杂的服务)。

简单的客户端。

REST的劣势

从开发者的角度来看,主要的缺点是它没有元数据。因此,它需要了解实现细节。在安全方面,RESTful服务依赖于HTTP安全性

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485