当前位置: 首页 > 后端技术 > Node.js

RESTfulAPI实践

时间:2023-04-03 10:58:34 Node.js

什么是REST?REST全称RepresentationalStateTransfer(简称REST),是RoyFielding博士在2000年的博士论文中提出的一种软件架构风格(http://www.ics.uci.edu/~field...)。它是一种网络应用的设计和开发方法,可以降低开发的复杂度,提高系统的可扩展性。六大约束:UniformInterface、Stateless、Cacheable、Client-Server、LayeredSystem、CodeonDemand、UniformInterface、REST架构风格区别于其他基于网络的架构风格的核心特征是强调组件之间的统一接口。通过将通用软件工程原理应用于组件接口,简化了整个系统架构并提高了交互的可见性。实现与它们提供的服务分离,这促进了独立的可演化性。然而,付出的代价是统一的接口降低了效率,因为信息是以标准化的形式传递的,而不是以特定于应用需求的形式传递的。REST接口旨在高效地传输大粒度超媒体数据,并针对Web上的常见情况进行了优化,但这也使得该接口对于其他形式的架构交互而言不是最佳选择。无状态(Stateless)通信在本质上必须是无状态的,因此客户端向服务器发出的每个请求都必须包含理解该请求所必需的所有信息,不能使用服务器上存储的任何上下文,因此需要将会话状态全部存储在客户端。缓存(Cacheable)是为了提高网络的效率。缓存约束要求响应请求中的数据隐式或显式标记为可缓存或不可缓存。如果响应是可缓存的,那么客户端缓存可以在将来为同一请求重用响应数据。客户端-服务器(Client-Server)通过分离用户界面和数据存储两个关注点,我们提高了用户界面跨多个平台的可移植性;同时,我们通过简化服务器组件提高了系统的可扩展性。然而,对于Web来说最重要的是,这种关注点分离允许组件独立发展以支持多个组织域的Internet规模需求。分层系统分层系统风格通过约束组件的行为(即,每个组件只能“看到”与之交互的紧邻层)将体系结构分解为多个层级。通过将组件对系统的了解限制在单个层中,它为整个系统的复杂性设置了界限,并提高了底层的独立性。我们能够使用层来封装遗留服务,屏蔽遗留客户端的新服务,并通过将不常用的功能移动到共享的中间组件中来简化组件实现。中间组件还可以通过支持跨多个网络和处理器的负载平衡来提高系统可扩展性。CodeonDemand通过减少必须预先实现的功能数量来简化客户端开发。允许部署后下载功能代码也提高了系统的可扩展性。但是,这也会降低可见性,因此它只是REST的一个可选约束。HTTP操作GETHTTPGET用于检索(读取)资源。正确的情况返回带有200HTTP响应代码的JSON,错误的情况通常返回404(NOTFOUND)或400(BADREQUEST)。示例GEThttp://www.example.com/custom...GEThttp://www.example.com/custom...GEThttp://www.example.com/bucket...通过GET它应该切勿修改服务器上的任何资源。POSTHTTPPOST通常用于创建资源。如果正确,则返回201HTTP响应代码和Location标头(资源URI)。示例POSThttp://www.example.com/customersPOSThttp://www.example.com/custom...PUTHTTPPUT通常用于更新资源。用已知资源的原始数据替换请求文本内容。示例PUThttp://www.example.com/custom...PUThttp://www.example.com/custom...DELETEHTTPDELETE用于删除由URI标识的资源。成功删除返回200HTTP和响应文本或无文本响应204HTTP(NOCONTENT)。示例DELETEhttp://www.example.com/custom...DELETEhttp://www.example.com/custom...DELETEhttp://www.example.com/bucket...下表是URICombineHTTPMETHOD建议返回值HTTPVerb(Method)/customers/customers/{id}GET200(OK)。对于客户列表,如果数据量大,可以使用页面排序筛选200(OK)。单一客户。404(未找到)ID客户不存在,400(错误请求)ID无效POST201(已创建),'Location'标头是/customers/{id}包含新资源ID404(未找到)PUT404(未找到找到)200(正常)或204(无内容)。404(NotFound)ID客户端不存在,400(BADREQUEST)ID无效DELETE404(NotFound)200(OK)或204(NoContent)。404(NotFound)ID客户不存在,400(BADREQUEST)ID不合法ResourceNaming命名工艺软件开发中的一切是成功的关键。除了HTTPVerb(Method)的正确应用之外,资源命名可以说是最具争议和最重要的概念。如果资源命名得当,API就会直观且易于使用。如果做得不好,相同的API会让人感觉过于肤浅,难以使用和理解。以下是一些提示,可帮助您在为新API创建资源URI时助您一臂之力。资源URI应该使用名词而不是动词来命名。RESTfulURI应该引用资源,而不是操作。名词有属性而动词没有。服务套件中的每个资源都至少有一个URI来标识它。URI应遵循可预测的分层结构,以提高可理解性,从而提高可用性。在包含客户、订单、行项目的订单系统中进行资源设计:创建一个新客户POSThttp://www.example.com/customers读取客户ID为33245GEThttp://www.example.com/custom。..相同的URI将用于更新(PUT)和删除(DELETE)客户这是为产品设计的URI:POSThttp://www.example.com/products创建一个新产品GET|PUT|DELETEhttp://www.example.com/produc...读取、更新、删除ID为66432的产品现在变得有趣了,我们如何为客户创建新订单?一种选择是POSThttp://www.example.com/orders毫无疑问它会起作用,但它脱离了客户的上下文,以下URI更清晰POSThttp://www.example.com/自定义。..现在我们知道该订单是为客户33245创建的要获取客户33245的订单,请使用以下URIGEThttp://www.example.com/custom...现在,让我们继续进行分层URI设计。如下:POSThttp://www.example.com/custom...这将向订单#8769(这是客户#33245)添加行项目,获取此URI资源将返回订单下的所有行项目,如果行没有意义或感觉超出客户上下文的项目我们会提供这样的URIPOSTwww.example.com/orders/8769/lineitems查看一些广泛使用的API以获得资源命名技巧并利用您的团队成员完善您的API资源。推特:https://dev.twitter.com/docs/apiFacebook:http://developers.facebook.co...LinkedIn:https://developer.linkedin.co...GitHub:https://developer。github.com/v3/ResponseBody简单响应示例{"url":"https://api.github.com/gists/20c98223d9b59e1d48e5","id":"1","description":"要点描述","public":true,"user":{"login":"octocat","id":1,"avatar_url":"https://github.com/images/error/octocat_happy.gif","gravatar_id":"somehexcode","url":"https://api.github.com/users/octocat"},"comments":0,"comments_url":"https://api.github.com/gists/19d18b30e8af75090307/comments/","html_url":"https://gist.github.com/1","git_pull_url":"git://gist.github.com/1.git","git_push_url":"git@gist.github.com:1.git","created_at":"2010-04-14T02:15:15Z"}分页响应total_count总记录项数据项示例{"total_count":40,"items":[{"id":3081286,"name":"俄罗斯方块","full_name":"dtrupenn/俄罗斯方块","owner":{"login":"dtrupenn","id":872147,"type":"User"},"private":false,"html_url":"https://github.com/dtrupenn/Tetris","description":"ACimplementationofTetrisusingPennsimthroughLC4","fork":false,"url":"https://api.github.com/repos/dtrupenn/Tetris","created_at":"2012-01-01T00:31:50Z","updated_at":"2013-01-05T17:58:47Z","pushed_at":"2012-01-01T00:37:02Z"}]}错误响应码错误码信息错误信息示例{"code":12345,"message":"错误描述"}参考资源http://www.restapitutorial.com/https://www.oschina.net/trans...