REST Service 探讨与实践

我们经常说的REST Service其实全称应该为RESTful Web Service,即REST Service 的实质还是Web Service,当这种Web Service符合REST的风格,就称这个Web Service为RESTful Web Service即REST Service。

什么是Web Service[1]

Web Service  技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

Web Service 常用的技术有XML, HTML, HTTP,  WSDL, SOAP,  MQ等。

另外IBM的WebSphere的软件平台,也全部提供了对Web Service技术的支持,正所以有对这些开放标准的全面支持,WebSphere软件在企业平台上能得到灵活的扩展和便捷的维护,这正是这种软件能被业界广泛采用的原因。这个不同于微软的不开放源代码的风格。

什么是REST[2]风格?

根据之前的一篇研究REST Service的文章,REST风格的Web Service必须遵循以下四个基本设计原则:

  • 显式地使用HTTP标准方法(GET, POST, PUT, DELETE)。
  • 无状态。
  • 公开目录结构式的URI。
  • 传输XML或JSON,或同时传输这两者。

这四个基本原则里面,有必要对第一点做一个详细的说明。

根据HTTP1.1规范,HTTP协议定义了很多标准方法,其中最重要的是GET和POST方法,因为GET和POST方法能满足客户端和服务器端交互的全部需求。

不论是GET还是POST方法,都是给服务器端发送Request,只是他们遵循的原理不一样。在一定程度上看,这两种方法最终结果都是一样的,过程确有所不同。

  • GET方法: 指客户端向服务器端发送获取数据的Request

这种方法由于将参数放在URL里面传输,比较方便,进而被大量采用。但是GET方法并非安全的方法,并且由于是放在URL里面而非request body里面传输,所以提交的数据量有限制,但POST方法理论上是没有限制的。

  • POST方法: 指客户端向服务器端发送修改数据的Requst

如提交form和上传文件,数据被包含在request body里面。

综上所述,使用REST风格的web service是回归了HTTP的标准方法,从而降低了开发的复杂度。另外无状态的数据设计原则则将服务器端大量的有状态的操作转移到了客户端,这样有助于分布式系统的架构,特别是目前互联网高并发,高负载的设计开发显得尤其重要。

如何使用?

在Cloud Marketplace项目中有CategoryViewHandler.findTopCategories() 这个REST Service,我们借这个例子来分析前台页面是如何调用REST Service的。

REST Service: CategoryViewHandler.findTopCategories()

介绍:http://www-01.ibm.com/support/knowledgecenter/SSZLC2_7.0.0/com.ibm.commerce.starterstores.doc/refs/rsm_search_CategoryViewHandler_fep7.htm

作用: 获取所有顶级的类目及其子类目。

URL Request:http://localhost/search/resources/store/18251/categoryview/@top?catalogId=12501&depthAndLimit=&responseFormat=json&responseFormat=json&langId=-1

URL Response:

{
	"catalogGroupView": [
		{
			"childCatalogGroupID": [
				"12501_10852",
				"12501_11351",
				"12501_10853",
				"12501_11352"
			],
			"identifier": "IBM Software",
			"name": "IBM Software",
			"parentCatalogGroupID": "-1",
			"resourceId": "http:\/\/localhost\/search\/resources\/store\/18251\/categoryview\/byId\/10851",
			"shortDescription": "IBM Software products",
			"storeID": "18151",
			"uniqueID": "10851"
		},
		{
			"childCatalogGroupID": "12501_12352",
			"identifier": "ibm_marketplace",
			"name": "Ibm_marketplace",
			"parentCatalogGroupID": "-1",
			"resourceId": "http:\/\/localhost\/search\/resources\/store\/18251\/categoryview\/byId\/12351",
			"storeID": "18151",
			"thumbnail": "\/wcsstore\/SCWExtendedSitesCatalogAssetStore\/\/images\/blank.png",
			"uniqueID": "12351"
		}
	],
	"recordSetComplete": "true",
	"recordSetCount": 2,
	"recordSetStartNumber": 0,
	"recordSetTotal": 2,
	"resourceId": "http:\/\/localhost\/search\/resources\/store\/18251\/categoryview\/@top?catalogId=12501&depthAndLimit=&responseFormat=json&responseFormat=json&langId=-1",
	"resourceName": "categoryview"
}

(URL从表象看,是符合REST设计风格的,并且reponse是JSON,也是符合REST设计原理的)

使用方法: 在JSP页面中,使用wcf:rest标签直接发送rest call,并且将response存储在var代表的变量中,如下面的代码片段:

<wcf:rest var="newcatalog" url="${searchHostNamePath}${searchContextPath}/store/${WCParam.storeId}/categoryview/@top" >
	<c:if test="${!empty WCParam.langId}">
	<wcf:param name="langId" value="${WCParam.langId}"/>
	</c:if>
	<c:if test="${empty WCParam.langId}">
	<wcf:param name="langId" value="${langId}"/>
	</c:if>

	<wcf:param name="responseFormat" value="json"/>
	<wcf:param name="catalogId" value="${WCParam.catalogId}"/>
</wcf:rest>

然后可以使用jstl或者直接写${newcatalog}的方式调用REST Service response,如下:

<h2>${newcatalog}</h2>

返回结果如下:

{"recordSetTotal":2,"resourceName":"categoryview","resourceId":"http:\/\/localhost\/search\/resources\/store\/18251\/categoryview\/@top?catalogId=12501&responseFormat=json&responseFormat=json&langId=-1","recordSetStartNumber":0,"recordSetComplete":"true","catalogGroupView":[{"shortDescription":"IBM Software products","resourceId":"http:\/\/localhost\/search\/resources\/store\/18251\/categoryview\/byId\/10851","identifier":"IBM Software","parentCatalogGroupID":"-1","name":"IBM Software","uniqueID":"10851","storeID":"18151","childCatalogGroupID":["12501_10852","12501_11351","12501_10853","12501_11352"]},{"resourceId":"http:\/\/localhost\/search\/resources\/store\/18251\/categoryview\/byId\/12351","identifier":"ibm_marketplace","parentCatalogGroupID":"-1","name":"Ibm_marketplace","uniqueID":"12351","thumbnail":"\/wcsstore\/SCWExtendedSitesCatalogAssetStore\/\/images\/blank.png","storeID":"18151","childCatalogGroupID":"12501_12352"}],"recordSetCount":2}

这个返回结果跟上面直接用HTTP request的方式返回的Response一致。

总结

在某种意义上,通过强调URI和HTTP等早期Internet标准,REST是对大型应用程序服务器时代之前的Web方式的回归。

RESTful Web Service对专有中间件(例如某个应用程序服务器)的依赖比传统的Web Service更少,因此减少了开发复杂度,提升了系统的可伸缩性,它作为一种设计Web服务的方法变得越来越流行。

参考资料

[1].http://baike.baidu.com/view/67105.htm

[2].http://blog.csdn.net/alli0968/article/details/42121567

时间: 2024-10-10 10:01:00

REST Service 探讨与实践的相关文章

阿里巴巴中间件团队在 Service Mesh 的实践和探索

摘要: 所有软件最重要的使命不是满足功能要求,而是演进,从而持续成长. 精彩观点导读:? 我们去探索一项技术,并不会仅仅因为其先进性,而是因为我们目前遇到了一些无法解决的问题,而这项技术正好能解决这个问题. ? 所有软件最重要的使命不是满足功能要求,而是演进,从而持续成长. ? 微服务本质是对服务的拆分,微服务架构符合工程领域常用的"分而治之"范式. 近日,在Aliware Open Source?成都站-Apache Dubbo 开发者沙龙上,阿里巴巴中间件高级技术专家李云(至简)向

容量规划的一些探讨与实践

之前产品线上发生过若干次因为tomcat连接池被耗尽而导致宕机的故障,而具体根源原因则各不尽相同.有因为调用和被调用的服务申请相同的分布式锁而导致死锁的,有因为发送内部或外部的JMS消息发生堵塞的,有因为某个存在性能问题的接口被较多调用导致的,还有某些超高频接口没有做好专门优化而导致的... 所有上述问题的本质解决,肯定是要针对各种问题根源,分别予以解决.解决死锁问题,外部接口做好严格的访问超时控制,非核心业务逻辑尽量异步处理,尽可能的通过增加cache来减少数据库压力等等.但除此之外,系统中任

蚂蚁金服 Service Mesh 实践探索

SOFAMesh是蚂蚁金服在ServiceMesh方向上的探索,下面是它高级技术专家敖小剑在QCon上海2018上的演讲. Service Mesh 是一个 基础设施层,用于处理服务间通讯.现代云原生应用有着复杂的服务拓扑,服务网格负责在这些拓扑中 实现请求的可靠传递. 在实践中,服务网格通常实现为一组 轻量级网络代理,它们与应用程序部署在一起,而 对应用程序透明. 加粗部分是重点: 基础设施层:这是 Service Mesh 的定位,今天内容的最后一个部分我会和大家详细展开这个话题: 服务间通

探讨 : Host在IIS上的WCF Service的执行方式

一个WCF请求由两个线程来完成 运行在IIS上的WCF service, 你可能会注意到一个比较有趣的现象. 当WCF service接收到一个请求时, 这个请求实际上会有两个线程在执行这个请求. 一个线程是来自于CLR的ThreadPool的线程. 这是一个Worker Thread用于接收.svc页面的访问请求. 另外一个线程是 I/O 线程, 用于执行WCF的逻辑. 你可以参考下面的实例代码. 该代码用于模拟一个WCF执行时间比较长的场景. [ServiceContract]public

android service被系统回收的解决方法

自己的app的service总是容易被系统回收,搜罗了一下,基本上的解决思路有以下几种: 1.把service写成系统服务,将永远不会被回收(未实践): 在Manifest.xml文件中设置persistent属性为true,则可使该服务免受out-of-memory killer的影响.但是这种做法一定要谨慎,系统服务太多将严重影响系统的整体运行效率. 2.提高service的优先级(未实践): 设置android:priority="1000" <!-- 为了消去加上andr

微服务架构与实践-王磊

(原文地址:http://www.infoq.com/cn/articles/microservice-and-continuous-delivery) 摘选书中节选-微服务与持续交付 十年以前,软件在一年之内的交付次数屈指可数. 过去的十年间,交付的过程一直被不断地优化和改进.从早期的RUP模型.敏捷.XP.Scrum,再到近几年的精益创业.DevOps,都力求能更有效地降低交付过程所耗费的成本并提高效率,从而尽早实现软件的价值. 持续交付是一种软件开发策略,用于优化软件交付的流程,以尽快得到

2016首场金融云计算新实践研讨会顺利召开

2016年3月22日下午,2016首场金融行业云计算新实践研讨会在上海市华山路1076号上海市信息中心1号会议室顺利召开.本次研讨会作为Future-S系列专业会议活动之一,由思科中国(Cisco)独家合作,上海信息化培训中心(SITC)发起,研讨会邀请的嘉宾都是来自于各大银行.证券.保险.基金等行业的IT中高级经理人和分管信息化的领导.嘉宾们围绕本次研讨会"金融企业云计算落地技术+管理运营" 的主题,圆桌深入讨论云计算的痛点.难点和实践应用. 研讨会开始前,上海信息化培训中心主任常威

微服务架构下 Service Mesh 会是闪亮的明天吗?

7月7日,时速云企业级容器 PaaS 技术沙龙第 10 期在上海成功举办,时速云容器架构负责人魏巍为大家详细讲解了 Service Mesh 中代表性的实践方案.并以 Istio 为例详细讲解了 Service Mesh 中的技术关键点,包括 Istio 控制平面.Istio 数据平面等.以下内容根据魏巍分享整编,希望对大家了解 Service Mesh 有所帮助. 魏巍:大家下午好,刚才几位讲师讲了 K8S 的存储.PaaS 在企业的落地实践等,我们接下来要讲的是企业有了 PaaS 平台.并且

微服务架构之「 下一代微服务 Service Mesh 」

Service Mesh 被大家称为下一代的微服务,是微服务领域的一颗新星,被大家讨论的非常多. 我在大家的讨论中,还看到有人说 “目前的微服务架构我都没学会呢,现在又来一个下一代微服务,真学不动了”. 哈哈,没办法,互联网技术就是发展得这么快,这些技术其实也都是由于大家所在的公司业务规模和复杂度变大以后所推动出来的. 最开始 Service Mesh 的概念是由Buoyant公司在2016年提出.然后在随后几年,业内就围绕着 Service Mesh 思想探索出了各种实现,其中包括以 Link