- cloudcone
-
App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session, 因此用session token来标示自己就够了,session/state由api server的逻辑处理。
如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session. 可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.
session 和 oauth token 并不矛盾,作为身份认证 token 安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态
restful是什么意思
restful在中文中有"使人感到悠闲的、宁静的"的意思,restful是什么意思 restful的中文翻译、读音、例句,其次还有"平静的"的意思,在线读音是[r"estful],restful是一个英语形容词。restful的中文翻译1.使人感到悠闲的例句:Distributed applications using HTTP as an application protocol, and built RESTfully, do have a contract, but of a different nature and kind.翻译:用HTTP作为应用协议、以RESTful方式构建的分布式应用其实有一个契约,但其性质和种类却不相同。2.宁静的例句:i find cemeteries very... restful places, don"t you?翻译:我觉得墓园... 是个非常宁静的地方,不是吗?3.平静的例句:# The restful peace within #翻译:你内心无声的和平。2023-07-08 11:43:331
什么是 restful?
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。RESTful架构是对MVC架构改进后所形成的一种架构,通过使用事先定义好的接口与不同的服务联系起来。在RESTful架构中,浏览器使用POST,DELETE,PUT和GET四种请求方式分别对指定的URL资源进行增删改查操作。因此,RESTful是通过URI实现对资源的管理及访问,具有扩展性强、结构清晰的特点。RESTful架构将服务器分成前端服务器和后端服务器两部分,前端服务器为用户提供无模型的视图;后端服务器为前端服务器提供接口。浏览器向前端服务器请求视图,通过视图中包含的AJAX函数发起接口请求获取模型。项目开发引入RESTful架构,利于团队并行开发。在RESTful架构中,将多数HTTP请求转移到前端服务器上,降低服务器的负荷,使视图获取后端模型失败也能呈现。但RESTful架构却不适用于所有的项目,当项目比较小时无需使用RESTful架构,项目变得更加复杂。2023-07-08 11:44:151
REST和RESTFUL
REST(Representational State Transfer),表述性状态转移,定义了互联网架构原则,是一种架构风格,具体原则如下: 1.互联网所有资源都可以被抽象为资源 2.每个资源都有唯一的资源标识符 3.同一个资源具有多个表现形式(可以是json,xml等等) 4.对资源的操作不会改变资源标识符 5.所有的操作都是无状态的 主要是就是说互联网上的资源可以用一种规则来表示,对资源的操作是无状态的。 RESTFUL,是指遵守rest规则的web服务,restful是一种ROA(Resource Oriented Architecture,面向资源的架构),restful的核心概念就是资源(Resource)。 互联网中客户端和服务端的交互就是资源的表述,这种表述是无状态的,也就意味着服务端要报错资源的所有状态,客户端可以通过http协议按照规定的规则访问或者改变资源的状态,就是所谓的“表述性状态转移”。 具体表现形式如下: GET /users 获取用户列表 GET /users/1 获取id(主键)为1的用户 POST /users 创建用户 PUT /users/1 修改id为1的用户(整条数据替换) PATCH /users/1 修改id为1的用户(数据局部字段替换) DELETE /users/1 删除id为1的用户 简单来说就是通过请求方法名来表示行为,url来表示操作的资源 更多例子: GET /users/1/products 获取id为1用户下的产品列表 GET /users/1/products/1 获取id为1用户下的id为1的产品 GET /users/name/aaa/products 获取name为aaa的用户下的产品列表 GET /users/name/aaa/products/name/ppp 获取name为aaa的用户下的名为ppp的产品 POST /users/1/products id为1的用户下创建一个产品 PUT /users/1/products/1 修改id为1的用户下的id为1的产品(整条数据替换) PATCH /users/1/products/1 修改id为1的用户下的id为1的产品(数据局部字段替换) DELETE /users/1/products/1 修改id为1的用户下的id为1的产品2023-07-08 11:44:301
什么是RESTful
先看REST是什么意思,英文Representational state transfer 表述性状态转移 其实就是对 资源 的表述性状态转移。 简单的说:RESTful是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构。 资源的地址 在web中就是URL (统一资源标识符) 资源是REST系统的核心概念。 所有的设计都是以资源为中心 结合项目怎么识别资源 1.商品加入购物车 购物车 2.提交订单 订单 3.创建用户 用户 围绕资源进行 添加,获取,修改,删除,以及对符合特定条件的资源进行列表操作 。针对资源设计接口 RESTful 架构的核心规范与约束:统一接口 分为四个子约束: 1.每个资源都拥有一个资源标识,每个资源的资源标识可以用来唯一地标明该资源 2.消息的自描述性 3.资源的自描述性。 4.HATEOAS Hypermedia As The Engine Of Application State(超媒体作为应用状态引擎) 即客户只可以通过服务端所返回各结果中所包含的信息来得到下一步操作所需要的信息,如到底是向哪个URL发送请求等。也就是说,一个典型的REST服务不需要额外的文档标示通过哪些URL访问特定类型的资源,而是通过服务端返回的响应来标示到底能在该资源上执行什么样的操作 目的:实现客户端无需借助任何文档即能调用到所有的服务器资源 三、资源的URL设计 1.通过URL来表示资源 资源分为主资源与子资源 因为主资源是一类独立的资源 所以主资源应直接放在相对路径下:例如 若要表示主资源的实例:如果实例的ID=1,则这样表示: /goods/1 子资源: 一个实例的子资源可能是一个集合也可能是一个单一的子资源 子资源为图片集合:/goods/1/pictures 子资源为商品折扣的单子子资源:/goods/1/discount 2.单数 vs. 复数 获取用户1的信息,哪种方式更符合RESTful? /api/users/1 /api/user/1 3.相对路径 vs. 请求参数 极光的RESTful API: 获取用户信息 GET /v1/users/{username} 参数放在路径中 VS 获取用户信息 GET /v1/users?username=xxxxx 拼接的方式 获取应用管理员列表 GET /v1/admins?start={start}&count={count} ?后拼接参数的方式:这种方式一般作为过滤资源 4.使用合适的动词 get delete put post 选择请求接口的方式: get delete PUT 在服务器更新资源(客户端提供改变后的完整资源)。 POST 在服务器新建一个资源 5.使用标准的状态码 GET hello world!!!2023-07-08 11:44:441
关于RESTful的六个限制
RESTfulapi是开发中常用的概念,那什么是REST,什么又是RESTfulapi? REST是Representational State Transfer的缩写 Representational :数据的表现形式(JSON、XML...) State:当前状态或者数据 Transfer:数据传输 看字面意思还是不太懂,没关系,接着看: 标准的 REST 六个限制如下: 参考内容:客户端-服务器模型 参考内容:无状态协议 参考内容:网页缓存 统一接口约束是设计任何REST服务的基础。 参考内容:分层系统 参考内容:客户端脚本 上文中提到了REST的6个限制,其中统一的接口需要统一成什么样子的呢? 1.资源的标识 RESTfulapi就是符合REST风格的api2023-07-08 11:44:571
RESTful 架构 (表现层状态转移)
概念是 Roy Thomas Fielding在他2000年的博士论文中提出的。他参与制定了 HTTP 1.0 和 HTTP 1.1 协议。 他希望能基于网络现有的协议基础上创建一个功能强大,性能游戏,适宜通信的架构。 如含义一样,将从逻辑上将业务实现拆分为客户端与服务端实现。 通过分离设计,能简化两边的设计复杂度,提高其可扩展性。 资源是 RESTful 的主体,主要指代互联网上的一个实体,可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。资源通过 URI 来唯一标识。 资源的信息载体形式,叫做表现层。他可以是文本、XML、JSON 或者是一个二进制文件。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。 互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。 在 HTTP 中,我们一般通过四种 HTTP 动词(verb)来对应资源的变化:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。 相应的状态的交互应当是无状态的(ServerLess)这是 HTTP 的特性所决定的,要求每次请求包含服务器需要的所有信息,这样可以很好的确保每一次变化的可预测性,进而提高可靠性,也能增进可扩展性。 综合上面的解释,我们总结一下什么是RESTful架构: (1)每一个URI代表一种资源; (2)客户端和服务器之间,传递这种资源的某种表现层; (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。 HTTP 请求是互联网架构中重要的一环,其在 TCP 连接的基础上,实现了语义化,缓存机制,无状态等等特性。在互联网上也有不错的性能,REST 常常会基于 HTTP 协议的基础上实现其核心概念。 论文中对 HTTP 与 REST 相适宜的论述提及了几点: 这里是论文中对 HTTP Code 来表现业务相应状态的相关表述: 原文: https://martinfowler.com/articles/richardsonMaturityModel.html 他讲这个模型层次分为四级,大概如下所示: 利用 HTTP 协议做数据交换,所有的参数描述通过 url 或者 POST body 形式通知服务器,返回相应的数据,此级别通常都是基于 。实质上就是基于 HTTP 的 RPC(远程过程调用),具体交付的细节完全由相关规范或团队内部约定解决。 根据理解设计了一份请求交互: 将 API 按照 RESTful 中资源的方式进行划分,初步有了自我描述(self description)的特性了,客户端可以对相关的资源进行更加细致的操作。 根据理解设计了一份请求交互: 这个级别有更加进一步的利用了 HTTP 的特性,增加了对 HTTP verb (比如 GET 表示查询、POST 表示创建、PUT 表示修改、DELETE 表示 等等)的运用,并且运用原有的 HTTP response status 来表征业务上请求的成功与失败,一般项目常见的 RESTful 运用基本都接近这个级别。 这个请求基本就和我们平时使用的 RESTful api 很接近了: 这个基本也称作 HATEOAS (Hypertext As The Engine Of Application State),这个级别是 RESTful 最复杂的实现,这个级别最理想的情况是,不需要特别复杂 API 文档进行描述的,这里的 API 设计最大化的实现了 RESTful 的自我描述特性。这种方案虽然引入很大的复杂性,但是最大限度的将 API 设计变得配置化了,所有 API 设计将会基于更加抽象的工作流设计了,稍后再做解释: 本阶段的相关请求模型大概是这样的: 可以看出,从查询到最终结果,都是由第一个 api 的返回的资源列表和操作项,引导向后面的操作,这样,后端在设计 API 的时候,需要考虑从一条业务 workflow 的角度去设计。这样只要整个流程不变,局部的数据变化,只需要修改后端的相关配置即可,这样业务可以很大程度的配置化。2023-07-08 11:45:131
什么是RESTful风格的API
REST -- REpresentational State Transfer 首先,之所以晦涩是因为前面的主语被去掉了,全称是 Resource Representational State Transfer,通俗来讲就是:资源在网络中以某种表现形式进行状态转移。 分解开来: Resource:资源,即数据(前面说过网络的核心)。比如 newsfeed,friends等; Representational:某种表现形式,比如用JSON,XML,JPEG等; State Transfer:状态变化。通过HTTP动词实现。 大家都知道“古代”网页是前端后端融在一起的,比如之前的PHP,JSP等,在之前的桌面时代,前后端融合在一起没啥问题,但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为Web、iOS、Android、小程序等提供接口API服务。另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要有显式的前端,只需要一套提供服务的接口,于是RESTful的API更是它们最好的选择。 根据Richardson Maturity Model(理查德森成熟度模型), REST架构的成熟度有4个等级: 我们在咖啡店向前台点了一杯拿铁咖啡,这个过程可以用这段文字来描述: 我们通过这段文字告诉前台,新增一笔订单,订单是一杯拿铁咖啡,接着,前台给我们返回这么一串回复: 假设我们有一张会员卡,我们想查询一下这张会员卡的余额,这时候要向前台发起另一个询问: 查询卡号为447031335的卡的余额,查询的结果返回来了: 没钱……哈哈哈,没钱,现在我们要跟前台说,这杯咖啡不要了: 现在这家咖啡店越做越大,来喝咖啡的人越来越多,单靠前台显然是不行的,店主决定进行分工,每个资源都有专人负责,我们可以直接面向资源操作。 比如还是下单,请求的内容不变,但是我们多了一条消息: 多了一个斜杠和orders,这是什么意思? 这个表示我们这个请求是发给哪个资源的,订单是一种资源,我们可以理解为是咖啡厅专门管理订单的人,他可以帮我们处理所有有关订单的操作,包括新增订单、修改订单、取消订单等操作。 接着还是会返回订单的编号给我们: 下面,我们还是要查询会员卡余额,这次请求的资源变成了cards: 接下来是取消订单: 接下来,店主还想继续优化他的咖啡厅的服务流程,他发现负责处理订单的员工,每次都要去订单内容里面看是新增订单还是删除订单,还是其他的什么操作,十分不方便,于是规定,所有新增资源的请求,都在请求上面写上大大的“POST”,表示这是一笔新增资源的请求。 其他种类的请求,比如查询类的,用‘GET"表示,删除类的,用‘DELETE"表示,修改用PATCH表示。 来,我们再来重复上面那个过程,来一杯拿铁: 请求的内容简洁多啦,不用告诉店员是addOrder,看到POST就知道是新增,返回的内容还是一样: 接着是查询会员卡余额,这次也简化了很多: 这个请求我们还可以进一步优化为这样: 直接把要查询的卡号写在后面了。 没错,接着,取消订单: 忽然有一天,有个顾客抱怨说,他买了咖啡后,不知道要怎么取消订单,咖啡厅一个店员回了一句,你不会看我们的宣传单吗,上面不写着: 顾客反问道,谁会去看那个啊,店员不服,又说到,你瞎了啊你……后面两人吵着吵着还打了起来… 噗,真是悲剧… 有了这次教训,店长决定,顾客下了单之后,不仅给他们返回订单的编号,还给顾客返回所有可以对这个订单做的操作,比如告诉用户如何删除订单。现在,我们还是发出请求,请求内容和上一次一样: 但是这次返回时多了些内容: 这次返回时多了一项link信息,里面包含了一个rel属性和url属性,rel是relationship的意思,这里的关系是cancel,url则告诉你如何执行这个cancel操作,接着你就可以这样子来取消订单啦: 哈哈,这服务真是贴心,以后再也不用担心店员和顾客打起来了。 Level 3的Restful API,给使用者带来了很大的便利,使用者只需要知道如何获取资源的入口,之后的每个URI都可以通过请求获得,无法获得就说明无法执行那个请求。 现在绝大多数的RESTful接口都做到了Level2的层次,做到Level3的比较少。当然,这个模型并不是一种规范,只是用来理解Restful的工具。所以,做到了Level2,也就是面向资源和使用http动词,就已经很Restful了。 Level 1 解释了如何通过分治法(Divide and Conquer)来处理复杂问题,将一个大型的服务端点(Service Endpoint)分解成多个资源。 Level 2 引入了一套标准的动词,用来以相同的方式应对类似的场景,移除不要的变化。 Level 3 引入了可发现性(Discoverability),它可以使协议拥有自我描述(Self-documenting)的能力。 这一模型帮助我们思考我们想要提供的HTTP服务是何种类型的,同时也勾勒出人们和它进行交互时的期望。 u2776 REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口); u2777 Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心, URL定位资源,用HTTP动词(GET/POST/DELETE/PATCH)来描述操作, u2778 用HTTP协议里的动词来实现资源的添加、修改、删除等操作。即通过HTTP动词来实现资源的状态转移: u2779 Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。当然还可以压缩HTTP传输时的数据(on-wire data compression); u277a 用 HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等。 好了,理解了RESTful的概念,究竟如何应用,这是个问题。根据项目的需求不同,我们的API设计规范也存在差别,完全看自身理解,满足自身需求,大的理念不变,根据需求制定项目的API规范就是好的RESTful。2023-07-08 11:45:421
restful api接口规范
restful api接口规范如下:1、协议API与用户的通信协议,总是使用HTTPs协议。2、域名应该尽量将API部署在专用域名之下。如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。3、版本(Versioning)应该将API的版本号放入URL。另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。4、路径(Endpoint)路径又称"终点"(endpoint),表示API的具体网址。在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。2023-07-08 11:45:571
restful api接口规范是什么?
REST(REpresentationStateTransfer)描述了一个架构样式的网络系统,比如web应用程序。一般依赖于HTTP认证,HTTP认证有几种:basic,digest,token,这些都有标准的实现的开源包需要主要的是这个认证的帐号跟你业务的帐户实际是不一样的。REST属于webService一种,安全是后台服务的安全,因此不需要实际的业务帐号,通常是系统keyStore证书库里的账户。RESTFUL特点包括:1、每一个URI代表1种资源。2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。3、通过操作资源的表现形式来操作资源。4、资源的表现形式是XML或者HTML。5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。2023-07-08 11:47:091
什么是 RESTful 到底 REST 和 SOAP,RPC 有何区别
第一个问题:什么是RESTful?REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。有兴趣可以看看这里论文`,谁是Fielding?点击前面名字了解。那RESTful到底是什么呢?简单的讲,它是:一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。推荐阅读:张善友博客——REST 入门介绍infoq——深入浅出REST第二个问题:到底 REST 和 SOAP、RPC 有何区别?这个问题比较大,要知道他们有什么区别首先需要明白,他们分别是什么?REST上面已经简单的说明了它是什么。SOAP(简单对象访问协议)是什么?SOAP是一种数据交换协议规范,是一种轻量的、简单的、基于XML的协议的规范。它有什么优点?简单总结为: 易用,灵活,跨语言,跨平台。易用:是因为它的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。灵活:表现在极具拓展性,SOAP 无需中断已有的应用程序, SOAP 客户端、 服务器和协议自身都能发展。而且SOAP 能极好地支持中间介质和层次化的体系结构。跨语言:soap可以使用任何语言来完成,只要发送正确的soap请求即可。跨平台:基于soap的服务可以在任何平台无需修改即可正常使用。RPC(远程调用框架) 是一种允许分布式应用程序调用网络上不同计算机的可用服务的机制。涉猎不多,一下省略256个字。有熟悉的朋友可以在评论补充,然后我会修改到该内容中去从上面我们可以看出,REST 和 SOAP、RPC 有何区别呢?没什么太大区别,他们的本质都是提供可支持分布式的基础服务,最大的区别在于他们各自的的特点所带来的不同应用场景。REST可以看着是http协议的一种直接应用,默认基于json作为传输格式,使用简单,学习成本低效率高,~~但是安全性较低~~,而SOAP可以看着是一个重量级的协议,基于xml,SOAP在安全方面是通过使用XML-Security和XML-Signature两个规范组成了WS-Security来实现安全控制的,当前已经得到了各个厂商的支持,.net ,php ,java 都已经对其有了很好的支持 。这是REST薄弱的地方。2023-07-08 11:48:441
什么是RESTfulAPI
什么是RESTfulAPI?RESTfulAPI是什么,以及如何使用它?RESTfulAPI是一种建立在HTTP协议和标准Web技术之上的API设计风格。它允许客户端和服务器之间进行交互,并利用现有的通信协议传输数据。与SOAP等其他传输协议相比,RESTfulAPI具有更好的可伸缩性和可维护性。要了解RESTfulAPI,必须先理解以下三个概念:1.资源:指的是可通过API访问的任何内容,例如网站上的文章、图像、评论等。对于每个资源,应该确定它的唯一标识符,以便轻松地与其交互。2.HTTP方法:指的是客户端可用于访问资源的方式,常用的方法有GET、POST、PUT和DELETE。3.表示:指的是服务器返回资源的表现形式,可以是HTML、XML、JSON或其他格式。RESTfulAPI的核心思想是通过HTTP方法以及URI对资源进行增删改查操作。例如:1.GET方法:用于获取资源,如从服务器检索网站上的文章或图像。示例URI:/articles/123。2.POST方法:用于创建新资源,如在网站上发布新文章或评论。示例URI:/articles。3.PUT方法:用于更新现有资源,例如更新文章的标题或内容。示例URI:/articles/123。4.DELETE方法:用于删除资源,例如删除文章或评论。示例URI:/articles/123。在实现RESTfulAPI时,应遵循以下几个原则:1.状态应该保存在客户端,而不是服务器上。2.必须使用标准HTTP方法和状态代码3.返回的表示应该是可缓存的。4.URI应该唯一标识每个资源。5.与服务器端无状态通信,每次请求都应该包括所有必要的信息。正确定义和实现RESTfulAPI,可以帮助开发人员更好地构建可扩展的分布式应用程序。此外,RESTfulAPI还可以被用于构建web服务,使其更加安全和高效。2023-07-08 11:49:451
Restful接口文档规范
基于目前的大前端时代,对于常年负责后台开发的我来说, 最重要的就是提供稳定的接口和文档。便于小伙伴们进行业务对接。 当下常用的是RestFul风格的定义规范, 之前开发是清一色Get、Post。引入RestFul后感觉接口定义规范很多,看接口地址就知晓是什么功能, 一起来看看列的一些基础规范吧。API与客户端用户的通信协议,总是使用HTTPS协议,以确保交互数据的传输安全。 应该尽量将API部署在专用域名之下: https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下: https://www.example.com/api https://api.example.com/v{n} 1、应该将API的版本号放入URL。 2、采用多版本并存,增量发布的方式。 3、n代表版本号,分为整型和浮点型 整型: 大功能版本, 如v1、v2、v3 ... 浮点型: 补充功能版本, 如v1.1、v1.2、v2.1、v2.2 ... 4、对于一个 API 或服务,应在生产中最多保留 3 个最详细的版本 路径又称"终点"(end point),表示API的具体网址。 1、在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词。 【所用的名词往往与数据库的表格名对应】 2、数据库中的表一般都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。 例子: https://api.example.com/v1/products https://api.example.com/v1/users https://api.example.com/v1/employees GET(SELECT): 从服务器取出资源(一项或多项)。 POST(CREATE): 在服务器新建一个资源。 PUT(UPDATE): 在服务器更新资源(客户端提供改变后的完整资源)。 DELETE(DELETE): 从服务器删除资源。 例子: GET /v1/products 获取所有商品 GET /v1/products/ID 获取某个指定商品的信息 POST /v1/products 新建一个商品 PUT /v1/products/ID 更新某个指定商品的信息 DELETE /v1/products/ID 删除某个商品,更合理的设计详见【9、非RESTful API的需求】 GET /v1/products/ID/purchases 列出某个指定商品的所有投资者 GET /v1/products/ID/purchases/ID 获取某个指定商品的指定投资者信息 若记录数量很多,服务器不可能返回全部记录给用户。 API应该提供分页参数及其它筛选参数,过滤返回结果。 /v1/products?page=1&pageSize=20 指定第几页,以及每页的记录数。 /v1/products?sortBy=name&order=asc 指定返回结果按照哪个属性排序,以及排序顺序。 传入参数分为4种类型: 1、cookie: 一般用于OAuth认证 2、request header: 一般用于OAuth认证 3、请求body数据: 4、地址栏参数: 1)restful 地址栏参数 /v1/products/ID ID为产品编号,获取产品编号为ID的信息 2)get方式的查询字段 见【六、过滤信息】 response: ---------------------------------------- { status: 200, // 详见【status】 data: { code: 1, // 详见【code】 data: {} || [], // 数据 message: "成功", // 存放响应信息提示,显示给客户端用户【须语义化中文提示】 sysMessage: "success" // 存放响应信息提示,调试使用,中英文都行 ... // 其它参数,如 total【总记录数】等 }, msg: "成功", // 存放响应信息提示,显示给客户端用户【须语义化中文提示】 sysMsg: "success" // 存放响应信息提示,调试使用,中英文都行 } ---------------------------------------- 【status】: 200: OK 400: Bad Request 500:Internal Server Error 401:Unauthorized 403:Forbidden 404:Not Found 【code】: 1: 获取数据成功 | 操作成功 0:获取数据失败 | 操作失败 1、实际业务开展过程中,可能会出现各种的api不是简单的restful 规范能实现的。 2、需要有一些api突破restful规范原则。 3、特别是移动互联网的api设计,更需要有一些特定的api来优化数据请求的交互。 1)、删除单个 | 批量删除 : DELETE /v1/product body参数{ids:[]} 2)、页面级API : 把当前页面中需要用到的所有数据通过一个接口一次性返回全部数据 1、前端需要哪些字段,API接口应该返回哪些字段,字段不多也不少。 2、更新功能尽量做到:初次返回的原始数据参数与提交更新的数据参数结构一致。 3、时间参数,尽量以一致格式的字符串传递, 如: ‘2019-01" | ‘2019/01" ‘2019-01-01" | ‘2019/01/01" ‘2019-01-01 12:12:12" | ‘2019/01/01 12:12:12" 1、尽量采用自动化接口文档,可以做到在线测试,同步更新。 2、应包含:接口BASE地址、接口版本、接口模块分类等。 3、每个接口应包含: 接口地址:不包含接口BASE地址。 请求方式: get、post、put、delete等。 请求参数:数据格式【默认JSON、可选form data】、数据类型、是否必填、中文描述。 相应参数:类型、中文描述。2023-07-08 11:50:301
restful哪种实现方式性能最好
基于RESTful 的几种实现1.1. RailsRuby on Rails是新兴的敏捷Web开发框架,在动态语言Ruby的支持下,Rails以新鲜的视角告诉我们Web开发是简单而快乐的。Rails对 RESTful Web Service的开发作了极大的封装和简化,这对开发人员来说是一个强大的工具。而且即将发布的Rails 2.0将全面基于REST。1.2. Axis2Apache Axis2是传统的Java Web Service框架Axis的下一代版本。从最初的Apache Axis和Apache SOAP到目前的Axis2,经历了大量变革和发展。相对以前的版本,Axis2更灵活、更高效、更简单。作为Java端官方和传统Web Service框架,在REST与SOAP的硝烟弥漫、战火纷飞的状况下,Axis2尝试同时支持SOAP和REST,采用了WSDL2.0中将REST 与Web服务结合的工作成果。1.3. DjangoDjango是基于python语言的敏捷Web和Web服务开发框架,它的设计与Rails十分类似,只不过简化和封装稍少一些。1.4. JSR 311: JAX-RSJAX-RS(JSR 311,Java API for XML-RESTful Web Services)是基于annotation的实现方式,我们通过annotation的方式把一个java class标注成RESTful web service,并把它的方法标注成HTTP的CRUD。相关的annotation有@path @Produces@GET @POST @DELETE @PUT @PathParam等,对java开发人员在使用起来比较方便。目前已经有很多现成的实现,比如Jersey Apache CXF JBoss RESTEasy1.5. 其他支持RESTful的Java框架Restlet(http://www.restlet.org/)Cetia4(https://cetia4.dev.java.net/)Apache Axis2(http://http://ws.apache.org/axis2/)sqlREST(http://sqlrest.sourceforge.net/)REST-art(http://rest-art.sourceforge.net/)RESTEasy的性能要好于 Jersey,无论哪种嵌入式JEE容器。Jersey+Grizzly2和Jersey+Jetty, dropwizard性能差别不大dropwizard底层实际是Jersey+Jetty,性能结果也和Jersey+Jetty一样RESTEasy+netty (netty3)的结果并没有优于RESTEasy+undertow.这出乎我的意料,可能CPU和Memory占用上会好一些RESTEasy+netty4的性能远远低于RESTEasy+netty3,这出乎我的意料。或许因为Netty线程池的改变。纯netty的性能远远高于其它框架,一方面是由于没有http router的逻辑,另一方面也显示了Netty框架的优秀。如果不是实现很复杂的路由和很多的Service,不妨使用纯Netty实现高性能。Spring Boot太厚重了,使用Spring MVC的语法,性能只有Jersey的一半。Vert.x底层使用Netty,可以使用Java 8 Lambda语法,也提供了其它语言的支持,但是性能看起来不是太好,而且随着并发量增大吞吐率也随之下降。2023-07-08 11:51:031
如何理解rest和restful,什么是restfulAPI?
简单理解一就是用URL定位资源,用HTTP描述操作。简单理解二URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。官方定义一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。以web开发举例在设计web接口的时候,REST主要是用于定义接口名,接口名一般是用名次写,不用动词,那怎么表达“获取”或者“删除”或者“更新”这样的操作呢——用请求类型来区分。比如,我们有一个students接口,对于“学生”我们有增删改查四种操作,怎么定义REST接口?增加一个学生,uri: http://testcode.com/school/students 接口类型:POST删除一个朋友,uri: http://testcode.com/school/students 接口类型:DELETE修改一个朋友,uri: http://testcode.com/school/students 接口类型:PUT查找朋友,uri: http://testcode.com/school/students 接口类型:GET上面我们定义的四个接口就是符合REST协议的,请注意,这几个接口都没有动词,只有名词students,都是通过Http请求的接口类型来判断是什么业务操作。举个反例uri: http://testcode.com/school/addStudents 该接口用来表示增加学生,这就是不符合REST协议的接口。建议用HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误,403表示Bad Request等。(反例:传统web开发返回的状态码一律都是200,其实不可取。)REST风格接口意义前后端分离。前端拿到数据只负责展示和渲染,不对数据做任何处理。后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web,ios,android三端都可以用相同的接口,节约开发成本以及便于同一调试。2023-07-08 11:51:321
什么是 RESTful 到底 REST 和 SOAP,RPC 有何区别
SOAP(Simple Object Access Protocol)简单对象访问协议,是基于HTTP的一种异构系统通信的协议,说白了就是xml文档传输,之所以会有它,就是在于不同语言C,C++,JAVA等语言开发的系统进行通信,是WebService就是基于SOAP协议的,确实是一种比较传统的SOA解决方案。 REST(Rerepresentational State Transfer)是外国一位博士提出的一种架构风格,从资源状态转换角度看待资源,但也是基于SOAP协议进行通信。 rest 是一种风格 restful Webservice 和 soap的区别在于表现形式不一样,如果想深入了解 可以去开开 深入理解Webservice 这本书,restful Webservice 不只是可以用json 也可以用xml 更可以用html做消息返回, rest 风格的Webservice 和传统的soap 主要的表现在于 rest是将资源暴露 soap是暴露操作 。具体的流程其实和soap是一样的,但是rest更方便,更轻。2023-07-08 11:51:441
什么是RESTful Web Service
1. 什么是Restful 其实早在web service概念产生前就有了restful的概念,或者说restful是和Http一起诞生的。 可以参阅 Roy Fielding 的论文“Architectural Styles and the Design of Network-based Software Architectures”, 我本身并没有读过。 Restful的意思是‘宁静的",你可以理解为‘简约而不简单",或者‘和谐的"。一个协议只有足够的简约才有扩展性和生命力,复杂的东西往往伴随的是大量bug和规模膨胀后的不可控。 Restful就是Http的本质,仅仅是一个资源URI,和Get,Post,Put,Delete四种操作。一切Web的行为皆源于此。 所以早期的网站,或者说是静态的网站的都是Restful的,如果广义的把浏览器获取web page当做一种web service的话,那么他们都提供了Restful Web Service。 所以Restful并不是个陌生的概念,更不是个新的概念,只不过是一直被忽略了。 一样东西之所以被忽略,因为没有对立面, 或者说没有可比较的东西。世界上的概念都是相对的,有了丑才有美,有了胖才有瘦。 同样当仅仅只有restful的时候,便很少有人真正了解restful的意思。 直到有一天,restful的原则被打破,世界上出现了非restful的web行为,我们可以把它称做‘RPC-style"的web service。2. RPC-style RPC是个大家都很熟悉的东西,remote procedure call,就是说我要调用其他机器上的程序就象调用我本机的函数一样。 早期的做法开个socket端口,把参数传过去,然后执行完再通过socket把结果传回来。 这样的缺点是就是不同的解决方案的传参数和结果的协议不同,大家之间没发通用,还有就是可能无法穿越防火墙。 直到XML技术诞生,用XML来规范接口,并且XML文档本身就是纯文本可以方便的通过Http端口传输,这样就大大的方便了在web互相之间的调用。 于是Web Service的概念诞生了,而这种Web Service是‘RPC-style"的。3. Http 顺便聊一下Http协议,Http诞生就是为了进行Web访问,用来传输Html文档的。不过他的能力远远大于此。 Http本身就是个envelope协议,他并不管envelop里面装的是什么,所以其实你可以通过http传输任意数据(图片,音乐),只要可以将它编码成文本(如用base64)。 Http本身规定了4种操作,可是他并没有强制服务器真正的行为。比如你通过Http发出的Get指令,服务器在收到这个指令后可以做些完全和Get不相关的事情。 Http的灵活性带来了很多好处,但同时也带来了副作用,Web不再restful,变的有点小乱。4. ROA 其实RPC-style和Restful看待事物的角度是不同的,大家都说Restful是一种RO,即面向资源的,那么RPC-style应该仍难是传统的OO,即面向对象的。 对于RPC-style而言,Server就是一个对象,这个对象有许多的属性和方法,我们通过http传递参数来调用这些方法,这里http仅仅被用来做为一个传递者,request的真正含义皆在soap envelop中。 对于Restful而言,Server就是个资源的集合,里面有web pages,web services,或其他资源,对于资源的操作是固定的。我们可以用http象访问网页一样访问web service。 对于Web而言,似乎ROA这种架构更能保持web访问的一致性,也更简单。5. Ajax Ajax出现的初始动机就是我们可以仅仅刷新部分网页,这样更快,也更合理,不然每次都要刷新整个网页。 同时,Ajax的出现也为遵守Restful原则提供了一种很好的solution。 Restful很重要的原则是无状态性,即服务器不会保存http request的上下文。这是很必要的,否则当用户很多时,服务器的负荷会爆掉的。 我们应该在客户端记录request上下文,然后每次发给服务器。 Ajax出现前,每次request都会刷新这个页面,所以很难记录之前request的上下文,现在有了Ajax, 用户不用每次刷新整个页面,所以可以有效的记录上下文。 所以可以比较简单的完成胖客户端-瘦服务器的架构。2023-07-08 11:51:581
什么是REST以及 RESTful?
image image 本文由 黑壳博客 转载 本文来源 什么是REST以及 RESTful?? imagepng imagepng 自从Roy Fielding博士在2000年他的博士论文中提出 REST (Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。 什么是Web API呢? 如果我们想要获取某个电商网站的某个商品,输入 http://localhost:9999/products/123 ,就可以看到id为123的商品页面,但这个结果是HTML页面,它同时混合包含了Product的数据和Product的展示两个部分。对于用户来说,阅读起来没有问题,但是,如果机器读取,就很难从HTML中解析出Product的数据。 如果一个URL返回的不是HTML,而是机器能直接解析的数据,这个URL就可以看成是一个Web API。比如,读取 http://localhost:9999/api/products/123 ,如果能直接返回Product的数据,那么机器就可以直接读取。 REST就是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,以JSON格式编写的REST风格的API具有简单、易读、易用的特点。 编写API有什么好处呢?由于API就是把Web App的功能全部封装了,所以,通过API操作数据,可以极大地把前端和后端的代码隔离,使得后端代码易于测试,前端代码编写更简单。 此外,如果我们把前端页面看作是一种用于展示的客户端,那么API就是为客户端提供数据、操作数据的接口。这种设计可以获得极高的扩展性。例如,当用户需要在手机上购买商品时,只需要开发针对iOS和Android的两个客户端,通过客户端访问API,就可以完成通过浏览器页面提供的功能,而后端代码基本无需改动。 当一个Web应用以API的形式对外提供功能时,整个应用的结构就扩展为: REST-arch REST-arch 把网页视为一种客户端,是REST架构可扩展的一个关键。 ** 网络上的所有事物都被抽象为资源** ** 每个资源都有一个唯一的资源标识符** ** 同一个资源具有多种表现形式(xml,json等)** ** 对资源的各种操作不会改变资源标识符** ** 所有的操作都是无状态的** ** 符合REST原则的架构方式即可称为RESTful** REST主要对以下两方面进行了规范 -定位资源的URL风格,例如 http://bhusk.com/admin/1234 http://bhusk.com/admin/1234/10/11 -如何对资源操作 采用HTTP协议规定的GET、POST、PUT、DELETE动作处理资源的增删该查操作 image image 对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务;rest式的web服务是一种ROA(The Resource-Oriented Architecture)(面向资源的架构). 符合REST约束风格和原则的应用程序或设计就是RESTful. - Spring MVC 对 RESTful应用提供了以下支持 - 利用@RequestMapping 指定要处理请求的URI模板和HTTP请求的动作类型 - 利用@PathVariable讲URI请求模板中的变量映射到处理方法参数上 - 利用Ajax,在客户端发出PUT、DELETE动作的请求 ** 可以采用Ajax方式发送PUT和DELETE请求** 采用RESTful架构后,需要将web.xml中控制器拦截的请求设置为/,这样会将css,js等静态资源进行拦截,发送404错误。 解决方法: 本篇文章参考了一部分 http://t.cn/RuZZUK3 , http://t.cn/RKO0YPr 程序员是个辛苦的职业 请善待你们身边的每一位程序员~ 欢迎在评论写下你的程序员趣事,程序员不是一个死板的职业~~ 欢迎扫描二维码加入我们的小组织 ,大家都叫我壳叔,很期待你的到来。 黑壳网交流群 Q 群: 200408242 11a84075a304ac57f6d37323512fd24cde9836350b9d80148b282eeaa188b196c2358d4ffd7006cbpng 11a84075a304ac57f6d37323512fd24cde9836350b9d80148b282eeaa188b196c2358d4ffd7006cbpng2023-07-08 11:52:061
举例说明,RESTful 到底有哪些好处
好处:REST规范:强调HTTP应当以资源为中心,并且规范了资源URI的风格;2.规范了HTTP请求动作(PUT,POST等)的使用,具有对应的语义;3.遵循REST规范的Web应用将会获得下面好处:a.URL具有很强可读性的,具有自描述性;b.资源描述与视图的松耦合;c.可提供OpenAPI,便于第三方系统集成,提高互操作性;d.如果提供无状态的服务接口,可提高应用的水平扩展性2023-07-08 11:52:401
RESTful风格的特点?
粉色冯绍峰是分色分2023-07-08 11:53:342
理解POST和PUT的区别,顺便提下RESTful
理解POST和PUT的区别,顺便提下RESTful 首先解释幂等,幂等是数学的一个用语,对于单个输入或者无输入的运算方法,如果每次都是同样的结果,则称其是幂等的 对于两个引数,如果传入值相等,结果也等于每个传入值,则称其为幂等的,如min(a,b) POST 用于提交请求,可以更新或者建立资源,是非幂等的 举个例子,在我们的支付系统中,一个api的功能是建立收款金额二维码,它和金额相关,每个使用者可以有多个二维码,如果连续呼叫则会建立新的二维码,这个时候就用POST PUT 用于向指定的URI传送更新资源,是幂等的 还是那个例子,使用者的账户二维码只和使用者关联,而且是一一对应的关系,此时这个api就可以用PUT,因为每次呼叫它,都将重新整理使用者账户二维码 比如一个介面用于使用者生成,接收的资料是使用者名称、密码等相关资讯,则用POST RESTful建议所有的URI都是对应资源,所以建立使用者不应该理解为一个行为,在此将此介面命名为: /user/creation 每次呼叫它都会新建一个使用者(假定使用者名称可以重复) 而PUT方法更加关心一个具体资源对应的URI,比如更新当前使用者资讯,这里可以用PUT /user/me/update 这里用me来指代当前使用者,如果是针对更多使用者适用的介面,可以考虑 /user/{uid}/update 注意多次呼叫同一介面,只要提交的资料一致,使用者资讯每次结果就会一致,即产生同样的结果:伺服器端某个具体的资源得到了更新 当需要以更新的形式来修改某一具体资源的时候,如何判断用PUT还是POST呢? 很简单,如果该更新对应的URI多次呼叫的结果一致,则PUT 比如更新某个blog文章,因为该文章具有单一的具体URI,所以每次更新提交相同的内容,结果都一致 /blog/{document_id}/update 在每次更新提交相同的内容,最终的结果不一致的时候,用POST 举个很常见的例子,一个介面的功能是将当前余额减一个值,每次提交指定该值为100,介面如下 /amount/deduction 呼叫一次,你的余额-100,呼叫两次,余额-200 这个时候就用POST RESTful的4种层次 Representational status transfer 个人理解为:表现形式的状态传递 1、只有一个介面交换xml来实现整个服务 目前我们的移动站点的服务就是类似的结构,我们有两个URI介面/mapp/lead和/msdk/safepay 2、每一个资源对应一个具体的URI,比1好维护,但是问题依然很明显,资源版本更新会引入时间戳维护,资源的获取和更新修改必须对应不同的URI 目前PC主站和移动站点的静态内容(包括档案)都是这种形式 3、在2的基础上使用了 verb,每个URI可以有不同的动作,充分利用了协议,所以自然居然协议的完整优势,比如快取和健壮性 HTML4.0只支援POST和GET,所以无论DELETE还是PUT操作,都用POST去模拟了 在WEB开发者看来,就是如果有资料变动,就用POST,如果没有,就用GET 所以目前中国使用者来看,PC端实现RESTful很困难,只有移动端支援Html5的浏览器,才能让前端做出尝试 4、现在似乎更加无法实际应用,Hypemedia control,也就是RESTful的本意,合理的架构原理和以网路为基础的设计相结合,带来一个更加方便、功能强大的通讯架构 在HTTP中,PUT被定义为idempotent的方法,POST则不是,这是一个很重要的区别。 “Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.” 上面的话就是说,如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。 REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的介面设计。在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现。 post[英] [pu0259ust] [美] [post] n. 邮件;邮政;柱,桩,杆;岗位; vt. 张贴;宣布;设岗;邮寄; vi. 快速行进; adj. 有关赛跑(或赛马,赛狗)起点标志的; adv. 〈外〉在后;用急件[驿马];赶紧地,火速地; put[英] [put] [美] [pu028at] vt. 放;表达;给予(重视、信任、价值等);使处于(某种状态); vt.& vi. 使感觉到;使受到…的影响; vi. 说;猛推;将…送往;使与…连线; n. [方]笨蛋,怪人;对策; adj. 固定的;不动的; restful[英] [u02c8restfu0259l] [美] [u02c8ru025bstfu0259l] adj. 平静的,悠闲的,让人得到休息的;安生; post 和 put 的区别 POST请求的URI表示处理该封闭实体的资源,该资源可能是个资料接收过程、某种协议的闸道器、或者接收注解的独立实体。然而,PUT请求中的URI表示请求中封闭的实体-使用者代理知道URI的目标,并且伺服器无法将请求应用到其他资源。如果伺服器希望该请求应用到另一个URI,就必须传送一个301响应;使用者代理可通过自己的判断来决定是否转发该请求。 HTTP/1.1没有定义一个PUT请求如何影响原始伺服器的状态。 PUT请求必须遵守资讯传输要求。 除非另有说明,PUT请求中的实体头部应该用于PUT建立或修改的资源上。 restful和soap的区别 rest轻量级,SOAP重量级;rest学习起来比较简单,容易上手,SOAP相对来说难些;rest能通过形式的直接呼叫,基于JSON,SOAP通过XML传输;rest效率和速度来说相对快些,SOAP则稍逊一筹 webservice和restful的区别 REST是一种架构风格,其核心是面向资源,REST专门针对网路应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。REST提出设计概念和准则为: 1.网路上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网路资源)只需要四种行为:建立,获取,更新和删除就可以完成相关的操作和处理。您可以通过统一资源识别符号(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。 由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分散式,丛集都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。 对于SOAP Webservice和Restful Webservice的选择问题,首先需要理解就是SOAP偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作物件的分离,有WSDL档案规范和XSD档案分别对其定义。而REST强调面向资源,只要我们要操作的物件可以抽象为资源即可以使用REST架构风格。 REST ful 应用问题 是否使用REST就需要考虑资源本身的抽象和识别是否困难,如果本身就是简单的类似增删改查的业务操作,那么抽象资源就比较容易,而对于复杂的业务活动抽象资源并不是一个简单的事情。比如校验使用者等级,转账,事务处理等,这些往往并不容易简单的抽象为资源。 其次如果有严格的规范和标准定义要求,而且前期规范标准需要指导多个业务系统整合和开发的时候,SOAP风格由于有清晰的规范标准定义是明显有优势的。我们可以在开始和实现之前就严格定义相关的介面方法和介面传输资料。 简单资料操作,无事务处理,开发和呼叫简单这些是使用REST架构风格的优势。而对于较为复杂的面向活动的服务,如果我们还是使用REST,很多时候都是仍然是传统的面向活动的思想通过转换工具再转换得到REST服务,这种使用方式是没有意义的。 效率和易用性 SOAP协议对于讯息体和讯息头都有定义,同时讯息头的可扩充套件性为各种网际网路的标准提供了扩充套件的基础,WS-*系列就是较为成功的规范。但是也由于SOAP由于各种需求不断扩充其本身协议的内容,导致在SOAP处理方面的效能有所下降。同时在易用性方面以及学习成本上也有所增加。 REST被人们的重视,其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源介面设计以及操作抽象简化了开发者的不良设计,同时也最大限度的利用了Http最初的应用协议设计理念。同时,在我看来REST还有一个很吸引开发者的就是能够很好的融合当前Web2.0的很多前端技术来提高开发效率。例如很多大型网站开放的REST风格的API都会有多种返回形式,除了传统的xml作为资料承载,还有(JSON,RSS,ATOM)等形式,这对很多网站前端开发人员来说就能够很好的mashup各种资源资讯 安全性 技术没有好坏,只有是不是合适,一种好的技术和思想被误用了,那么就会得到反效果。REST和SOAP各自都有自己的优点,同时如果在一些场景下如果去改造REST,其实就会走向SOAP(例如安全)。 REST对于资源型服务介面来说很合适,同时特别适合对于效率要求很高,但是对于安全要求不高的场景。而SOAP的成熟性可以给需要提供给多开发语言的,对于安全性要求较高的介面设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义,关键还是看应用场景。 同时很重要一点就是不要扭曲了REST现在很多网站都跟风去开发REST风格的介面,其实都是在学其形,不知其心,最后弄得不伦不类,效能上不去,安全又保证不了。 成熟度 SOAP虽然发展到现在已经脱离了初衷,但是对于异构环境服务释出和呼叫,以及厂商的支援都已经达到了较为成熟的情况。不同平台,开发语言之间通过SOAP来互动的web service都能够较好的互通。 由于没有类似于SOAP的权威性协议作为规范,REST实现的各种协议仅仅只能算是私有协议,当然需要遵循REST的思想,但是这样细节方面有太多没有约束的地方。REST日后的发展所走向规范也会直接影响到这部分的设计是否能够有很好的生命力。 restful和的区别 REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的介面设计。在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现。 个人理解: (一) 首先REST只是一种风格,不是一种标准 (二) REST是以资源为中心的 (三) REST充分利用或者说极端依赖HTTP协议 一.对于今天正在吸引如此多注意力的最纯粹形式的 REST Web 服务,其具体实现应该遵循以下基本设计原则: 1.1.显式地使用不同的 HTTP 请求方法 1.2.无状态 1.3.公开目录结构式的 URI(通过逻辑URI定位资源)。 1.1.显式地使用不同的 HTTP 请求方法 我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(建立、读取、更新和删除)操作: 若要在伺服器上建立资源,应该使用 POST 方法。 若要检索某个资源,应该使用 GET 方法。 若要更改资源状态或对其进行更新,应该使用 PUT 方法。 若要删除某个资源,应该使用 DELETE 方法。 PHP中put和post区别 1. 使用支援和范围的区别: PHP提供了对PUT方法的支援,在Http定义的与伺服器的互动方法中,PUT是把讯息本体中的讯息传送到一个URL,形式上跟POST类似; PHP 提供对诸如 Netscape Composer 和 W3C Amaya 等客户端使用的 HTTP PUT 方法的支援; PHP 4 中,必须使用标准的输入流来读取一个 HTTP PUT 的内容; PUT方法没有POST方法使用广泛,但PUT方法却是向伺服器上传档案最有效率的方法: 2.上传过程的区别: POST上传档案时,通常需要将所有的资讯组合成multipart 传送过去,然后伺服器再解码这些资讯,解码过程则必不可少的会消耗记忆体和CPU资源,这种现象在上传大档案时尤其明显; PUT方法则允许你通过与伺服器建立的socket连结传递档案的内容,而不附带其他的资讯,效果上更直接; 3.上传效果的区别: PHP 接受到 PUT 方法的请求时,会把上传的档案储存到和其它用 POST 方法处理过的档案相同的临时目录;请求结束时,临时档案将被删除。 用来处理 PUT 的 PHP 指令码必须将该档案拷贝到其它的地方; 4. POST和PUT请求根本区别 POST请求的URI表示处理该封闭实体的资源,该资源可能是个资料接收过程、某种协议的闸道器、或者接收注解的独立实体; PUT请求中的URI表示请求中封闭的实体-使用者代理知道URI的目标; 伺服器无法将请求应用到其他资源; 如果伺服器希望该请求应用到另一个URI,就必须传送一个301响应; 使用者代理可通过自己的判断来决定是否转发该请求; get和post的区别,你真的理解吗 get是收到得到 post 发出一进一出就是根本区别 He is ( ) a coat Ain B putting on C wearing 选什么? 顺便讲下in put on wear的区别 选C。 in强调穿着什么样的衣服(这里一般 用in引导的介词短语 作定语。); 例:The girl in a blue blouse is my sister. in a blue blouse是介词短语,在句中作为定语来修饰the girl。 put on强调穿上衣服的动作,一般用现在进行时; 例:The girl is putting on a blue blouse. put on是行为动词的固定搭配。 wear强调穿着某衣服的状态。 例:The girl wears a blue blouse. wear意为“穿着”。2023-07-08 11:53:501
如何更好的设计RESTful API
确保安全性可以从三个方面去做: 对客户端做身份认证 对敏感的数据做加密,并且防止篡改 身份认证之后的授权 现在比较流行的是使用OAuth协议做身份认证2023-07-08 11:54:113
为什么说restful更易于实现缓存机制
无状态是针对于“状态”来说的。一个WEB应用协议中的“状态”指的是,为两个相互关联的用户交互操作保留某种公共信息,例如用户登录信息,工作流等。这些信息具有不同作用域,如page,request,session,application等。通常由服务器负责保存这些信息。“无状态”的概念逐渐流行,得益于分布式系统的发展。首先,无状态请求易于实现负载均衡。在分布式web系统下,有多个可用服务器,每个服务器都可以处理客户端请求。传统的有状态请求,因为状态信息只保存在第一次发起请求的那台服务器上,之后的请求都只能由这台服务器来处理,服务器无法自由调度请求。无状态请求则完全没有这个限制。其次,无状态请求有较强的容错性和可伸缩性。如果一台服务器宕机,无状态请求可以透明地交由另一台可用服务器来处理,而有状态的请求则会因为存储请求状态信息的服务器宕机而承担状态丢失的风险。需要注意的是,“状态"指请求的状态,而不是资源的状态。Restful风格的无状态约束要求服务器不保存请求状态,如果确实需要维持用户状态,也应由客户端负责。传递usercredentials是Restful的,而传递sessionID是unRestful的,因为session信息保存在服务器端。2023-07-08 11:54:481
什么是rest和restful
REST ( REpresentational State Transfer ) 首字母的缩写, ≠ rest。REST是一种架构风格,是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。REST核心是面向资源, 其专门针对网络应用设计和开发方式, 以降低开发的复杂性,提高系统的可伸缩性。2023-07-08 11:56:341
:什么才是真正的 RESTful 架构
Representational State Transfer,简称REST)是Roy Fielding博士于2000年在他的博士论文中提出来的一种软件架构风格。Roy Fielding是HTTP协议(1.0版和1.1版)的主要设计者,事实上HTTP 1.1规范正是基于REST架构风格的指导原理来设计的。需要注意的是,REST是一种设计风格而不是标准,如果一个架构符合REST原则,我们就称它为RESTful架构。Why?而要理解RESTful架构,最好的方法就是去理解Representational State Transfer这个词组,直译过来就是「表现层状态转化」,其实它省略了主语。「表现层」其实指的是「资源」的「表现层」,所以通俗来讲就是:资源在网络中以某种表现形式进行状态转移。分解开来:Resource:资源,即数据。比如newsfeed,friends,order等;Representational:某种表现形式,比如用JSON,XML,JPEG等;State Transfer:状态变化。通过HTTP动词实现。2023-07-08 11:57:481
RESTful GET,如果存在大量参数,是否有必要变通一下
别折腾了,一般人根本就做不了RESTful。绝大部分人都理解RESTful是一种接口的设计形式,然后发现很多时候某些需求根本没法做成RESTful形式的,但就我看来RESTful是从底层架构就应该考虑的问题,或者说是一种架构设计思想,而不仅仅只针对于接口。比如题主的这个情况,如果要让我来做,我会设计两个接口POST /shop/1/query 新建一个商品的查询,返回idGET /shop/1/query/{id} 获取某个查询的结果为什么要这么设计?1.RESTful中,URI代表资源,html/图片这类文件是资源,query这类服务也是资源2.RESTful中,POST用来新建或者更新,GET用来获取资源但是很显然,这肯定不满足题主的需求,要这样做现有的架构肯定满足不了,所以,别折腾了2023-07-08 11:58:431
如何使用RestTemplate访问restful服务
定义一个简单的restful接口@RestControllerpublic class TestController{@RequestMapping(value = "testPost", method = RequestMethod.POST)public ResponseBean testPost(@RequestBody RequestBean requestBean){ResponseBean responseBean = new ResponseBean();responseBean.setRetCode("0000");responseBean.setRetMsg("succ");return responseBean;}}使用RestTemplate访问该服务//请求地址String url = "http://localhost:8080/testPost";//入参RequestBean requestBean = new RequestBean();requestBean.setTest1("1");requestBean.setTest2("2");requestBean.setTest3("3");RestTemplate restTemplate = new RestTemplate();ResponseBean responseBean = restTemplate.postForObject(url, requestBean, ResponseBean.class);从这个例子可以看出,使用restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 请求地址、请求参数、HTTP响应转换被转换成的对象类型。RestTemplate方法的名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指示返回的内容。本例中调用了restTemplate.postForObject方法,post指调用了HTTP的post方法,Object指将HTTP响应转换为您选择的对象类型。还有其他很多类似的方法,有兴趣的同学可以参考官方api。三.手动指定转换器(HttpMessageConverter)我们知道,调用reseful接口传递的数据内容是json格式的字符串,返回的响应也是json格式的字符串。然而restTemplate.postForObject方法的请求参数RequestBean和返回参数ResponseBean却都是java类。是RestTemplate通过HttpMessageConverter自动帮我们做了转换的操作。默认情况下RestTemplate自动帮我们注册了一组HttpMessageConverter用来处理一些不同的contentType的请求。如StringHttpMessageConverter来处理text/plain;MappingJackson2HttpMessageConverter来处理application/json;MappingJackson2XmlHttpMessageConverter来处理application/xml。你可以在org.springframework.http.converter包下找到所有spring帮我们实现好的转换器。如果现有的转换器不能满足你的需求,你还可以实现org.springframework.http.converter.HttpMessageConverter接口自己写一个。详情参考官方api。选好了HttpMessageConverter后怎么把它注册到我们的RestTemplate中呢。RestTemplate restTemplate = new RestTemplate();//获取RestTemplate默认配置好的所有转换器List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();//默认的MappingJackson2HttpMessageConverter在第7个 先把它移除掉messageConverters.remove(6);//添加上GSON的转换器messageConverters.add(6, new GsonHttpMessageConverter());这个简单的例子展示了如何使用GsonHttpMessageConverter替换掉默认用来处理application/json的MappingJackson2HttpMessageConverter。四.设置底层连接方式要创建一个RestTemplate的实例,您可以像上述例子中简单地调用默认的无参数构造函数。这将使用java.NET包中的标准Java类作为底层实现来创建HTTP请求。但很多时候我们需要像传统的HttpClient那样设置HTTP请求的一些属性。RestTemplate使用了一种很偷懒的方式实现了这个需求,那就是直接使用一个HttpClient作为底层实现......//生成一个设置了连接超时时间、请求超时时间、异常最大重试次数的httpClientRequestConfig config = RequestConfig.custom().setConnectionRequestTimeout(10000).setConnectTimeout(10000).setSocketTimeout(30000).build();HttpClientBuilder builder = HttpClientBuilder.create().setDefaultRequestConfig(config).setRetryHandler(new DefaultHttpRequestRetryHandler(5, false));HttpClient httpClient = builder.build();//使用httpClient创建一个ClientHttpRequestFactory的实现ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);//ClientHttpRequestFactory作为参数构造一个使用作为底层的RestTemplateRestTemplate restTemplate = new RestTemplate(requestFactory);五.设置拦截器(ClientHttpRequestInterceptor)有时候我们需要对请求做一些通用的拦截设置,这就可以使用拦截器进行处理。拦截器需要我们实现org.springframework.http.client.ClientHttpRequestInterceptor接口自己写。举个简单的例子,写一个在header中根据请求内容和地址添加令牌的拦截器。public class TokenInterceptor implements ClientHttpRequestInterceptor{@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException{//请求地址String checkTokenUrl = request.getURI().getPath();//token有效时间int ttTime = (int) (System.currentTimeMillis() / 1000 + 1800);//请求方法名 POST、GET等String methodName = request.getMethod().name();//请求内容String requestBody = new String(body);//生成令牌 此处调用一个自己写的方法,有兴趣的朋友可以自行google如何使用ak/sk生成token,此方法跟本教程无关,就不贴出来了String token = TokenHelper.generateToken(checkTokenUrl, ttTime, methodName, requestBody);//将令牌放入请求header中request.getHeaders().add("X-Auth-Token",token);return execution.execute(request, body);}}创建RestTemplate实例的时候可以这样向其中添加拦截器RestTemplate restTemplate = new RestTemplate();//向restTemplate中添加自定义的拦截器restTemplate.getInterceptors().add(new TokenInterceptor());2023-07-08 11:59:082
怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful
REST -- REpresentational State Transfer 直接翻译:表现层状态转移。这个中文直译经常出现在很多博客中。尼玛谁听得懂“表现层状态转移”?这是人话吗?我自己也困惑了很久,查询了很多资料,花了差不多一年有个还算清晰的理解。分享如下: Ivony 老师的一句话概括很精辟:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。--- 简洁版 ---0. REST不是"rest"这个单词,而是几个单词缩写。但即使那几个单词说出来,也无法理解在说什么 -_-!! (不是要贬低人,是我自己也理解困难);1. REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);2. Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。2023-07-08 11:59:501
给App开发restful接口是不是只能用POST
App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session, 因此用session token来标示自己就够了,session/state由api server的逻辑处理。如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session. 可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session.session 和 oauth token 并不矛盾,作为身份认证 token 安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态2023-07-08 12:01:051
理解POST和PUT的区别,顺便提下RESTful
6、 江南春 杜牧2023-07-08 12:01:392
网站,不对外开放API,有必要用restful吗
没必要用restfulrestful把协议和应用逻辑弄在一起的设计本身也不好2023-07-08 12:02:152
为什么restful不能用登陆
要先进行注册,再用注册的账号登录restful不必保持用户登录状态,只需要身份验证就可以,比如token认证。但是无论是web开发,还是移动app开发,都需要有判断用户的登录状态,web叫做会话,用session储存。app的实现方法类似,只是把登录状态存到了客户端。web的实现是这样的,如果需要用到restful api,那么在前端和restful之间加一个node做中间层,node调用restful接口获取数据,并创建session会话。所以session处理和判断用户登录状态是放在node这端的,而不是在restful中操作2023-07-08 12:03:391
什么是Restful API
1、不使用url参数: 传统API设计:/api/list?pageIndex=2 Restful API设计:/api/list/2 2、用method表示操作类型 传统API设计: Restful API设计: 3、传统API设计:把每个url当做一个功能 Restful API设计:把每个url当做一个唯一的资源 简单说Restful API就是API的规范。 目的: 1、为了实现前后端分离。 2、减少沟通成本,让API通俗易懂,提高API的可读性。 3、多端公用一套接口 在 REST 架构风格中,每一个 URI 代表一种资源。因此,URI 是每一个资源的地址的唯一资源定位符。所谓资源,实际上就是一个信息实体,它可以是服务器上的一段文本、一个文件、一张图片、一首歌曲,或者是一种服务。RESTful API 规定了通过 GET、 POST、 PUT、 PATCH、 DELETE 等方式对服务端的资源进行操作。 http://www.ruanyifeng.com/blog/2014/05/restful_api.html2023-07-08 12:04:361
接口协议restful报文类型xml通用格式怎么测试
ic class TestHttp { public void testRegist(){ try{ StringBuffer sb = new StringBuffer("<?xml version="1.0" encoding="UTF-8" ?> "); sb.append("<getData>"); sb.append("<recNum>2015</recNum>"); sb.append("<accountID>wangxin2015</accountID>"); sb.append("</getvData>"); byte[] xmlbyte = sb.toString().getBytes("UTF-8"); URL url = new U uxxx/xxxxxx"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setDoOutput(true2023-07-08 12:06:221
RESTful API 设计约定
本文编写目的是为了尽可能的约定好一个公司的产品、组件、项目开发的RESTful API 设计风格,使不同团队间设计的API风格尽量一致,减少项目后期由于规范问题或设计不足导致的接口重构造成的开发、测试返工。最终让接口的最终使用者能够在开发过程中有个良好的体验。 此约定可作为开发人员设计RESTful 接口或项目接口发布评审的参考。 个人观点:用了 JSON-RPC 不等于 是RESTful API ,RESTful API通常是基于HTTP/JSON方式实现的 ,两种方式的API设计方式都不错,项目中选适合的就好。简单对比如下: 本文仅是作者个人根据主观喜好和接口设计经验搜罗总结而来的RESTful API设计约定,仅作为接口设计的基本要求,也欢迎与大家讨论。此约定未涉及超文本HATEOAS相关内容,也不包含RPC类面向后端服务方法映射接口的范畴。 API 是后端应用程序的脸面(UI),用户体验非常重要。尤其是当你开发的是一个可复用的组件或产品,如果API设计有些许瑕疵,会直接影响开发者的体验,设计者会被骂的…… 有问题的API一旦开放出去了,哪怕是简单的拼写错误,由于要保持兼容性不能删改,会成为技术欠债长期背下去。 以上关键点不只适用于RESTful API,其他类型API也是一样的。 作为对外公开发布的RESTful API,根URL中一般要有域名与版本信息。通常一个WEB站点会同时提供网站服务和API服务,我们需要根据URL能够区分出访问的是服务接口还是网站中的网页、文件等资源。因此RESTful API的根URL中根据不同场景一般会在一级域名中或者是子域名中带api关键字。 常见的两种根URL用法如下: 推荐的方案是根URL中采用子域名的方式区分API,即: https://iam.primeton.com/api/v1/* 路径终点即粗体部分内容: https:// example.org/api/v1/ menus 设计RESTful API时常用的HTTP Method包括:GET、POST、PUT、PATCH、DELETE 简单说明如下: 根据资源标识可以 唯一定位一个资源 时,建议使用URL路径参数方式传递。对应Springboot 的 @PathVariable 。API Path示例如下: 根据资源属性查询过滤 一或多个资源 时,建议使用URL查询参数方式传递。对应Springboot的 @RequestParam 。API Path示例如下: 对于简单查询类接口,可以使用路径参数和查询参数解决,如果是复杂功能型查询接口中需要通过复杂的过滤条件查询时如: > < in between 等等,查询参数用起来会非常痛苦,GET Method又不支持提交Request Body参数。因此我建议这种 复杂型查询采用POST Method 提交到一个特定的Path上 。参见如下场景: 查询接口返回多个数据时,需要支持分页(枚举类数据或少量数据除外)和排序。 如需使用分页查询和排序,建议统一请求与响应报文结构,格式如下: 请求参数示例: GET /users?page=1&size=5&sort=username 单页数据响应结果示例: 上述分页排序与响应报文格式是来自Spring Data定义的模型,为了保持分页排序接口相关的使用习惯,如果持久化不使用JPA,仍然建议采用上述规范的报文定义封装接口。为使用者提供一致的体验。 如果资源需要做一些增删改之外的操作(如状态变更),可以用 /actions 作为path 例如:流程平台中的流程实例会有状态变化,如启动、挂起、恢复、终止等等,这种接口建议这样设计: 组合资源,即两种资源之间存在组合关系,组合指整体与部分的强包含关系,但整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。对"部分"的操作一定会由整体作为入口,不会直接跳过"整体"来对"部分"做增删改查。这种组合场景中,推荐API设计方式示例如下: 聚合资源,即两种资源之间存在聚合关系。聚合也是整体与部分的弱包含关系,但整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个不同的主体对象,也可以为多个整体对象共享。 例如,机构或角色下包含人员,需要获取机构或角色下的人员的场景,避免做成分别通过机构入口或角色入口找人等重复的具有类似功能的接口: 在RESTful API设计中,正常和异常情况建议通过HTTP约定的status进行区分, 不建议 采用所有接口均POST Method调用,永远返回200这种模式。 推荐的常用Http Status说明如下: HTTP 1.0 Status 详细说明参考 API调用成功后,返回HTTP 2xx状态码,Response Body直接返回业务数据即可。请求和响应报文建议统一采用JSON格式。 RESTful API 对于异常报文需要规范和统一,服务端出现异常情况下,需要进行全局拦截,然后将异常信息封装为规范的格式,返回给调用端。 对于后端的异常信息,建议包含编码和消息 本文是基于学习各路大神们对RESTful 设计相关文章,结合自己设计接口时遇到困惑后的解决方案,收集与总结而成的RESTful API设计约定。部分内容夹杂个人喜好与主观观点,抛砖引玉,希望能为大家设计API带来些许帮助。后如果遇到一些更复杂的场景,欢迎一起沟通。2023-07-08 12:07:191
Restful接口框架jersey
所有框架都是在下面这个网站中查询得到的: https://mvnrepository.com/ 注意:选择框架的依赖的版本不要选择太高,最好选择之前比较成熟的版本 第一步:jersey client框架 // https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client compile group: "org.glassfish.jersey.core", name: "jersey-client", version: "2.28" 第二步:jersey server框架,version选择低版本 compile group: "org.glassfish.jersey.core", name: "jersey-server", version: "" 第三步:jersey-container-servlet框架,version选择低版本 compile group: "org.glassfish.jersey.containers", name: "jersey-container-servlet", version: "" 第四步:jersey-hk2框架,version选择低版本 // https://mvnrepository.com/artifact/org.glassfish.jersey.inject/jersey-hk2 compile group: "org.glassfish.jersey.inject", name: "jersey-hk2", version: "" 第五步:jersey.media的json解析库,version选择低版本 compile group: "org.glassfish.jersey.media", name: "jersey-media-json-jackson", version: ""2023-07-08 12:07:261
怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful
背景:小A准备给他外地的女朋友寄一封爱情的信件,于是去学校的商店买了一个信封,外加一些非常漂亮的信纸回到宿舍,他诗兴大发,洋洋洒洒一封几千字的情书就写好了,该填信封了,这时,他对信封有点不满意为什么这样说呢?他发现他买的信封竟然需要自己DIY,需要自己写填自己想填的内容,可能这类信封的设计初衷,是为了显示寄信人的创意,可是这很操蛋不是吗,这样的信封邮局会收吗?于是他找到了卖信封的小姐姐小A:美女,我买的信封怎么这么奇葩呀?上面居然需要自己设计,这样的东西一点不规范呢商店姐姐:这不符合当代年轻人的个性吗?不是为了显示你寄信的用心和独特吗小A:可是,假如我在上面写一些无关紧要的内容,邮局的人会不会杀了我商店姐姐:傻瓜,我的意思是你可以在上面画或者一些有趣的东西,基本信息肯定还是要按照邮局的标准来,我这里有个模板,你自己看看小A接过来,恍然大悟,原来是这样,标准还是标准,要是不按照标准来,邮局的人每天光看信封都得累死回到宿舍躺着,思考刚才的一幕。小A毕竟是学计算机的,突然明白过来,要是我们上网的请求乱七八糟,解析判断请求就得哭死(就和邮局的人看乱七八糟的信封是一个道理),甚至很可能压根就解析不了请求,因此采需要一套标准。因此,我们请求的信息需要全部展现给服务器(邮局)。然后邮差们在配送的过程中实际上是可以不用在意所配送的信件的状态的,这就可以类比为REST的无状态。当然我们是可以向快递那样加上快递的物流状态,但是在通信的过程中,实际上是没有必要的,这样会消耗更多的计算力。故设计成无状态不仅仅安全(邮差不会拆开我们的信件)还省事(不用浪费多的计算)。提到了无状态,当然REST还有其他几个特性,比如,需要提供统一的接口,我们寄信肯定找邮局,收信也是。邮局我们可以理解成一个controller。个人的理解是REST最为重要的特性就是无状态。虽然用寄信件类比这个过程有点牵强,因为一般我们web是需要响应的,这里的响应我们可以理解成对方回信,这个不像HTML,是请求一定一定有响应,寄信就不一定了。--------------------- 作者:喝粥也会胖的唐僧 来源:CSDN 原文:https://blog.csdn.net/zhou_438/article/details/83617315 版权声明:本文为博主原创文章,转载请附上博文链接!2023-07-08 12:07:462
restful api接口规范是什么?
一、协议API与用户的通信协议,总是使用HTTPs协议。二、域名应该尽量将API部署在专用域名之下。https://api.example.com如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。https://example.org/api/三、版本(Versioning)应该将API的版本号放入URL。https://api.example.com/v1/另一种做法是,将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。四、路径(Endpoint)路径又称"终点"(endpoint),表示API的具体网址。在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。2023-07-08 12:07:531
如何通过类对象作为方法参数的RESTful服务吗
REST(REpresentationStateTransfer)描述了一个架构样式的网络系统,比如web应用程序。它首次出现在2000年RoyFielding的博士论文中,他是HTTP规范的主要编写者之一。REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。Web应用程序最重要的REST原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI(UniversalResourceIdentifier)得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的HTTP方法,比如GET、PUT、POST和DELETE。Hypermedia是应用程序状态的引擎,资源表示通过超链接互联。另一个重要的REST原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现。RESTful的实现:RESTfulWeb服务与RPC样式的Web服务了解了什么是什么是REST,我们再看看RESTful的实现。最近,使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端点。它忽略HTTP的大部分特性且仅支持POST方法。由于轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java程序、Perl、Ruby、Python、PHP和Javascript[包括Ajax])实现客户端。RESTfulWeb服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的Web浏览器构建一个GETURL并读取返回的内容。在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTPGET、POST、PUT、DELETE,还可能包括HEADER和OPTIONS。在RPC样式的架构中,关注点在于方法,而在REST样式的架构中,关注点在于资源--将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。LeonardRichardson和SamRuby在他们的著作RESTfulWebServices中引入了术语REST-RPC混合架构。REST-RPC混合Web服务不使用信封包装方法、参数和数据,而是直接通过HTTP传输数据,这与REST样式的Web服务是类似的。但是它不使用标准的HTTP方法操作资源。它在HTTP请求的URI部分存储方法信息。好几个知名的Web服务,比如Yahoo的FlickrAPI和del.icio.usAPI都使用这种混合架构。RESTful的实现:RESTfulWeb服务的Java框架有两个Java框架可以帮助构建RESTfulWeb服务。eromeLouvel和DavePawson开发的Restlet(见参考资料)是轻量级的。它实现针对各种RESTful系统的资源、表示、连接器和媒体类型之类的概念,包括Web服务。在Restlet框架中,客户端和服务器都是组件。组件通过连接器互相通信。该框架最重要的类是抽象类Uniform及其具体的子类Restlet,该类的子类是专用类,比如Application、Filter、Finder、Router和Route。这些子类能够一起处理验证、过滤、安全、数据转换以及将传入请求路由到相应资源等操作。Resource类生成客户端的表示形式。JSR-311是SunMicrosystems的规范,可以为开发RESTfulWeb服务定义一组JavaAPI。Jersey是对JSR-311的参考实现。JSR-311提供一组注释,相关类和接口都可以用来将Java对象作为Web资源展示。该规范假定HTTP是底层网络协议。它使用注释提供URI和相应资源类之间的清晰映射,以及HTTP方法与Java对象方法之间的映射。API支持广泛的HTTP实体内容类型,包括HTML、XML、JSON、GIF、JPG等。它还将提供所需的插件功能,以允许使用标准方法通过应用程序添加其他类型。RESTful的实现:构建RESTfulWeb服务的多层架构RESTfulWeb服务和动态Web应用程序在许多方面都是类似的。有时它们提供相同或非常类似的数据和函数,尽管客户端的种类不同。例如,在线电子商务分类网站为用户提供一个浏览器界面,用于搜索、查看和订购产品。如果还提供Web服务供公司、零售商甚至个人能够自动订购产品,它将非常有用。与大部分动态Web应用程序一样,Web服务可以从多层架构的关注点分离中受益。业务逻辑和数据可以由自动客户端和GUI客户端共享。惟一的不同点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各种类型的数据存储提供插件能力。图1展示了自动化客户端,包括Java和各种语言编写的脚本,这些语言包括Python、Perl、Ruby、PHP或命令行工具,比如curl。在浏览器中运行且作为RESTfulWeb服务消费者运行的Ajax、Flash、JavaFX、GWT、博客和wiki都属于此列,因为它们都代表用户以自动化样式运行。自动化Web服务客户端在Web层向ResourceRequestHandler发送HTTP响应。客户端的无状态请求在头部包含方法信息,即POST、GET、PUT和DELETE,这又将映射到ResourceRequestHandler中资源的相应操作。每个请求都包含所有必需的信息,包括ResourceRequestHandler用来处理请求的凭据。从Web服务客户端收到请求之后,ResourceRequestHandler从业务逻辑层请求服务。ResourceRequestHandler确定所有概念性的实体,系统将这些实体作为资源公开,并为每个资源分配一个惟一的URI。但是,概念性的实体在该层是不存在的。它们存在于业务逻辑层。可以使用Jersey或其他框架(比如Restlet)实现ResourceRequestHandler,它应该是轻量级的,将大量职责工作委托给业务层。Ajax和RESTfulWeb服务本质上是互为补充的。它们都可以利用大量Web技术和标准,比如HTML、JavaScript、浏览器对象、XML/JSON和HTTP。当然也不需要购买、安装或配置任何主要组件来支持Ajax前端和RESTfulWeb服务之间的交互。RESTfulWeb服务为Ajax提供了非常简单的API来处理服务器上资源之间的交互。图1中的Web浏览器客户端作为GUI的前端,使用表示层中的BrowserRequestHandler生成的HTML提供显示功能。BrowserRequesterHandler可以使用MVC模型(JSF、Struts或Spring都是Java的例子)。它从浏览器接受请求,从业务逻辑层请求服务,生成表示并对浏览器做出响应。表示供用户在浏览器中显示使用。表示不仅包含内容,还包含显示的属性,比如HTML和CSS。业务规则可以集中到业务逻辑层,该层充当表示层和数据访问层之间的数据交换的中间层。数据以域对象或值对象的形式提供给表示层。从业务逻辑层中解耦BrowserRequestHandler和ResourceRequestHandler有助于促进代码重用,并能实现灵活和可扩展的架构。此外,由于将来可以使用新的REST和MVC框架,实现它们变得更加容易,无需重写业务逻辑层。数据访问层提供与数据存储层的交互,可以使用DAO设计模式或者对象-关系映射解决方案(如Hibernate、OJB或iBATIS)实现。作为替代方案,业务层和数据访问层中的组件可以实现为EJB组件,并取得EJB容器的支持,该容器可以为组件生命周期提供便利,管理持久性、事务和资源配置。但是,这需要一个遵从JavaEE的应用服务器(比如JBoss),并且可能无法处理Tomcat。该层的作用在于针对不同的数据存储技术,从业务逻辑中分离数据访问代码。数据访问层还可以作为连接其他系统的集成点,可以成为其他Web服务的客户端。数据存储层包括数据库系统、LDAP服务器、文件系统和企业信息系统(包括遗留系统、事务处理系统和企业资源规划系统)。使用该架构,您可以开始看到RESTfulWeb服务的力量,它可以灵活地成为任何企业数据存储的统一API,从而向以用户为中心的Web应用程序公开垂直数据,并自动化批量报告脚本。什么是REST:结束语REST描述了一个架构样式的互联系统(如Web应用程序)。REST约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过HTTP直接传输数据的特性,RESTfulWeb服务成为基于SOAP服务的一个最有前途的替代方案。用于web服务和动态Web应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax和RESTfulWeb服务本质上是互为补充的。2023-07-08 12:08:074
下面哪几种属于ElasticSearch的RESTful请求方式()
下面哪几种属于ElasticSearch的RESTful请求方式() A.Post(正确答案) B.Get(正确答案) C.Delete(正确答案) D.Update2023-07-08 12:08:141
关于各大平台API为什么不使用restful的风格
一个好的RESTfulAPI,应该具备以下特征: 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 1.浏览器是最常见和最通用的REST客户端。好的RESTfulAPI应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTfulAPI的功能组合起来,建造Mashup类的应用。 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。 REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTfulAPI的核心内容。RESTfulAPI建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTfulAPI建模的过程,可以看作是具有统一接口约束的面向对象建模过程。 按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。 2.如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出的资源。设计出资源(以及相应的URI)对于RESTfulAPI来说并没有什么害处。 这个API应该是松耦合的。 RESTfulAPI的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTfulAPI的松耦合性。 3.当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不了。感兴趣的读者可以参考《REST实战》。 这个API中所使用的表述格式应该是常见的通用格式 在RESTfulAPI中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。 4.这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。 使用HTTP响应状态代码来表达各种出错情况 HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:statuscode和reasonphase。两部分都是可定制的,也可以使用标准的statuscode,只定制reasonphase。 5.如果一个所谓的“RESTfulAPI”对于任何请求都返回200OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。 这个API应该对于HTTP缓存是友好的 6.充分利用好HTTP缓存是RESTfulAPI可伸缩性的根本。HTTP协议是一个分层的架构,从两端的useragent到originserver之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。2023-07-08 12:08:221
举例说明,RESTful 到底有哪些好处
好处:REST规范:强调HTTP应当以资源为中心,并且规范了资源URI的风格;2.规范了HTTP请求动作(PUT,POST等)的使用,具有对应的语义;3.遵循REST规范的Web应用将会获得下面好处:a.URL具有很强可读性的,具有自描述性;b.资源描述与视图的松耦合;c.可提供OpenAPI,便于第三方系统集成,提高互操作性;d.如果提供无状态的服务接口,可提高应用的水平扩展性;2023-07-08 12:08:291
多终端 为什么采用restful的接口设计规范
REST(REpresentationStateTransfer)描述了一个架构样式的网络系统,比如web应用程序。 它首次出现在2000年RoyFielding的博士论文中,他是HTTP规范的主要编写者之一。 REST指的是一组架构约束条件和原则。 满足这些约束条件和原则的应用程序或设计就是RESTful。 Web应用程序最重要的REST原则是,客户端和服务器之间的交互在请求之间是无状态的。 从客户端到服务器的每个请求都必须包含理解请求所必需的信息。 如果服务器在请求之间的任何时间点重启,客户端不会得到通知。 此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。 客户端可以缓存数据以改进性能。 在服务器端,应用程序状态和功能可以分为各种资源。 资源是一个有趣的概念实体,它向客户端公开。 资源的例子有:应用程序对象、数据库记录、算法等等。 每个资源都使用URI(UniversalResourceIdentifier)得到一个惟一的地址。 所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。 使用的是标准的HTTP方法,比如GET、PUT、POST和DELETE。 Hypermedia是应用程序状态的引擎,资源表示通过超链接互联。 另一个重要的REST原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。 通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。 当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。 它还降低了客户端和服务器之间的交互延迟。 统一界面简化了整个系统架构,改进了子系统之间交互的可见性。 REST简化了客户端和服务器的实现。 RESTful的实现:RESTfulWeb服务与RPC样式的Web服务了解了什么是什么是REST,再看看RESTful的实现。 最近,使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。 RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。2023-07-08 12:08:371
webservice和restful的区别
REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理。您可以通过统一资源标识符(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。 由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。 对于SOAP Webservice和Restful Webservice的选择问题,首先需要理解就是SOAP偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。而REST强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用REST架构风格。REST ful 应用问题 是否使用REST就需要考虑资源本身的抽象和识别是否困难,如果本身就是简单的类似增删改查的业务操作,那么抽象资源就比较容易,而对于复杂的业务活动抽象资源并不是一个简单的事情。比如校验用户等级,转账,事务处理等,这些往往并不容易简单的抽象为资源。 其次如果有严格的规范和标准定义要求,而且前期规范标准需要指导多个业务系统集成和开发的时候,SOAP风格由于有清晰的规范标准定义是明显有优势的。我们可以在开始和实现之前就严格定义相关的接口方法和接口传输数据。 简单数据操作,无事务处理,开发和调用简单这些是使用REST架构风格的优势。而对于较为复杂的面向活动的服务,如果我们还是使用REST,很多时候都是仍然是传统的面向活动的思想通过转换工具再转换得到REST服务,这种使用方式是没有意义的。效率和易用性 SOAP协议对于消息体和消息头都有定义,同时消息头的可扩展性为各种互联网的标准提供了扩展的基础,WS-*系列就是较为成功的规范。但是也由于SOAP由于各种需求不断扩充其本身协议的内容,导致在SOAP处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。 REST被人们的重视,其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源接口设计以及操作抽象简化了开发者的不良设计,同时也最大限度的利用了Http最初的应用协议设计理念。同时,在我看来REST还有一个很吸引开发者的就是能够很好的融合当前Web2.0的很多前端技术来提高开发效率。例如很多大型网站开放的REST风格的API都会有多种返回形式,除了传统的xml作为数据承载,还有(JSON,RSS,ATOM)等形式,这对很多网站前端开发人员来说就能够很好的mashup各种资源信息安全性 技术没有好坏,只有是不是合适,一种好的技术和思想被误用了,那么就会得到反效果。REST和SOAP各自都有自己的优点,同时如果在一些场景下如果去改造REST,其实就会走向SOAP(例如安全)。 REST对于资源型服务接口来说很合适,同时特别适合对于效率要求很高,但是对于安全要求不高的场景。而SOAP的成熟性可以给需要提供给多开发语言的,对于安全性要求较高的接口设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义,关键还是看应用场景。 同时很重要一点就是不要扭曲了REST现在很多网站都跟风去开发REST风格的接口,其实都是在学其形,不知其心,最后弄得不伦不类,性能上不去,安全又保证不了。成熟度 SOAP虽然发展到现在已经脱离了初衷,但是对于异构环境服务发布和调用,以及厂商的支持都已经达到了较为成熟的情况。不同平台,开发语言之间通过SOAP来交互的web service都能够较好的互通。 由于没有类似于SOAP的权威性协议作为规范,REST实现的各种协议仅仅只能算是私有协议,当然需要遵循REST的思想,但是这样细节方面有太多没有约束的地方。REST日后的发展所走向规范也会直接影响到这部分的设计是否能够有很好的生命力。2023-07-08 12:08:441
spring cloud 服务调用方式为什么使用http restful 而不是RPC
REST(REpresentationStateTransfer)描述了一个架构样式的网络系统,比如web应用程序。它首次出现在2000年RoyFielding的博士论文中,他是HTTP规范的主要编写者之一。REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。Web应用程序最重要的REST原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用URI(UniversalResourceIdentifier)得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的HTTP方法,比如GET、PUT、POST和DELETE。Hypermedia是应用程序状态的引擎,资源表示通过超链接互联。另一个重要的REST原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。当REST架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。REST简化了客户端和服务器的实现。RESTful的实现:RESTfulWeb服务与RPC样式的Web服务了解了什么是什么是REST,我们再看看RESTful的实现。最近,使用RPC样式架构构建的基于SOAP的Web服务成为实现SOA最常用的方法。RPC样式的Web服务客户端将一个装满数据的信封(包括方法和参数信息)通过HTTP发送到服务器。服务器打开信封并使用传入参数执行指定的方法。方法的结果打包到一个信封并作为响应发回客户端。客户端收到响应并打开信封。每个对象都有自己独特的方法以及仅公开一个URI的RPC样式Web服务,URI表示单个端点。它忽略HTTP的大部分特性且仅支持POST方法。由于轻量级以及通过HTTP直接传输数据的特性,Web服务的RESTful方法已经成为最常见的替代方法。可以使用各种语言(比如Java程序、Perl、Ruby、Python、PHP和Javascript[包括Ajax])实现客户端。RESTfulWeb服务通常可以通过自动客户端或代表用户的应用程序访问。但是,这种服务的简便性让用户能够与之直接交互,使用它们的Web浏览器构建一个GETURL并读取返回的内容。在REST样式的Web服务中,每个资源都有一个地址。资源本身都是方法调用的目标,方法列表对所有资源都是一样的。这些方法都是标准方法,包括HTTPGET、POST、PUT、DELETE,还可能包括HEADER和OPTIONS。在RPC样式的架构中,关注点在于方法,而在REST样式的架构中,关注点在于资源--将使用标准方法检索并操作信息片段(使用表示的形式)。资源表示形式在表示形式中使用超链接互联。LeonardRichardson和SamRuby在他们的著作RESTfulWebServices中引入了术语REST-RPC混合架构。REST-RPC混合Web服务不使用信封包装方法、参数和数据,而是直接通过HTTP传输数据,这与REST样式的Web服务是类似的。但是它不使用标准的HTTP方法操作资源。它在HTTP请求的URI部分存储方法信息。好几个知名的Web服务,比如Yahoo的FlickrAPI和del.icio.usAPI都使用这种混合架构。RESTful的实现:RESTfulWeb服务的Java框架有两个Java框架可以帮助构建RESTfulWeb服务。eromeLouvel和DavePawson开发的Restlet(见参考资料)是轻量级的。它实现针对各种RESTful系统的资源、表示、连接器和媒体类型之类的概念,包括Web服务。在Restlet框架中,客户端和服务器都是组件。组件通过连接器互相通信。该框架最重要的类是抽象类Uniform及其具体的子类Restlet,该类的子类是专用类,比如Application、Filter、Finder、Router和Route。这些子类能够一起处理验证、过滤、安全、数据转换以及将传入请求路由到相应资源等操作。Resource类生成客户端的表示形式。JSR-311是SunMicrosystems的规范,可以为开发RESTfulWeb服务定义一组JavaAPI。Jersey是对JSR-311的参考实现。JSR-311提供一组注释,相关类和接口都可以用来将Java对象作为Web资源展示。该规范假定HTTP是底层网络协议。它使用注释提供URI和相应资源类之间的清晰映射,以及HTTP方法与Java对象方法之间的映射。API支持广泛的HTTP实体内容类型,包括HTML、XML、JSON、GIF、JPG等。它还将提供所需的插件功能,以允许使用标准方法通过应用程序添加其他类型。RESTful的实现:构建RESTfulWeb服务的多层架构RESTfulWeb服务和动态Web应用程序在许多方面都是类似的。有时它们提供相同或非常类似的数据和函数,尽管客户端的种类不同。例如,在线电子商务分类网站为用户提供一个浏览器界面,用于搜索、查看和订购产品。如果还提供Web服务供公司、零售商甚至个人能够自动订购产品,它将非常有用。与大部分动态Web应用程序一样,Web服务可以从多层架构的关注点分离中受益。业务逻辑和数据可以由自动客户端和GUI客户端共享。惟一的不同点在于客户端的本质和中间层的表示层。此外,从数据访问中分离业务逻辑可实现数据库独立性,并为各种类型的数据存储提供插件能力。图1展示了自动化客户端,包括Java和各种语言编写的脚本,这些语言包括Python、Perl、Ruby、PHP或命令行工具,比如curl。在浏览器中运行且作为RESTfulWeb服务消费者运行的Ajax、Flash、JavaFX、GWT、博客和wiki都属于此列,因为它们都代表用户以自动化样式运行。自动化Web服务客户端在Web层向ResourceRequestHandler发送HTTP响应。客户端的无状态请求在头部包含方法信息,即POST、GET、PUT和DELETE,这又将映射到ResourceRequestHandler中资源的相应操作。每个请求都包含所有必需的信息,包括ResourceRequestHandler用来处理请求的凭据。从Web服务客户端收到请求之后,ResourceRequestHandler从业务逻辑层请求服务。ResourceRequestHandler确定所有概念性的实体,系统将这些实体作为资源公开,并为每个资源分配一个惟一的URI。但是,概念性的实体在该层是不存在的。它们存在于业务逻辑层。可以使用Jersey或其他框架(比如Restlet)实现ResourceRequestHandler,它应该是轻量级的,将大量职责工作委托给业务层。Ajax和RESTfulWeb服务本质上是互为补充的。它们都可以利用大量Web技术和标准,比如HTML、JavaScript、浏览器对象、XML/JSON和HTTP。当然也不需要购买、安装或配置任何主要组件来支持Ajax前端和RESTfulWeb服务之间的交互。RESTfulWeb服务为Ajax提供了非常简单的API来处理服务器上资源之间的交互。图1中的Web浏览器客户端作为GUI的前端,使用表示层中的BrowserRequestHandler生成的HTML提供显示功能。BrowserRequesterHandler可以使用MVC模型(JSF、Struts或Spring都是Java的例子)。它从浏览器接受请求,从业务逻辑层请求服务,生成表示并对浏览器做出响应。表示供用户在浏览器中显示使用。表示不仅包含内容,还包含显示的属性,比如HTML和CSS。业务规则可以集中到业务逻辑层,该层充当表示层和数据访问层之间的数据交换的中间层。数据以域对象或值对象的形式提供给表示层。从业务逻辑层中解耦BrowserRequestHandler和ResourceRequestHandler有助于促进代码重用,并能实现灵活和可扩展的架构。此外,由于将来可以使用新的REST和MVC框架,实现它们变得更加容易,无需重写业务逻辑层。数据访问层提供与数据存储层的交互,可以使用DAO设计模式或者对象-关系映射解决方案(如Hibernate、OJB或iBATIS)实现。作为替代方案,业务层和数据访问层中的组件可以实现为EJB组件,并取得EJB容器的支持,该容器可以为组件生命周期提供便利,管理持久性、事务和资源配置。但是,这需要一个遵从JavaEE的应用服务器(比如JBoss),并且可能无法处理Tomcat。该层的作用在于针对不同的数据存储技术,从业务逻辑中分离数据访问代码。数据访问层还可以作为连接其他系统的集成点,可以成为其他Web服务的客户端。数据存储层包括数据库系统、LDAP服务器、文件系统和企业信息系统(包括遗留系统、事务处理系统和企业资源规划系统)。使用该架构,您可以开始看到RESTfulWeb服务的力量,它可以灵活地成为任何企业数据存储的统一API,从而向以用户为中心的Web应用程序公开垂直数据,并自动化批量报告脚本。什么是REST:结束语REST描述了一个架构样式的互联系统(如Web应用程序)。REST约束条件作为一个整体应用时,将生成一个简单、可扩展、有效、安全、可靠的架构。由于它简便、轻量级以及通过HTTP直接传输数据的特性,RESTfulWeb服务成为基于SOAP服务的一个最有前途的替代方案。用于web服务和动态Web应用程序的多层架构可以实现可重用性、简单性、可扩展性和组件可响应性的清晰分离。Ajax和RESTfulWeb服务本质上是互为补充的。2023-07-08 12:08:531
webservice和restful的区别
REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。REST提出设计概念和准则为: 1.网络上的所有事物都可以被抽象为资源(resource) 2.每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识 3.所有的操作都是无状态的 REST简化开发,其架构遵循CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建,获取,更新和删除就可以完成相关的操作和处理。您可以通过统一资源标识符(Universal Resource Identifier,URI)来识别和定位资源,并且针对这些资源而执行的操作是通过 HTTP 规范定义的。其核心操作只有GET,PUT,POST,DELETE。 由于REST强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题。极大的提高系统的可伸缩性。 对于SOAP Webservice和Restful Webservice的选择问题,首先需要理解就是SOAP偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义。而REST强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用REST架构风格。REST ful 应用问题 是否使用REST就需要考虑资源本身的抽象和识别是否困难,如果本身就是简单的类似增删改查的业务操作,那么抽象资源就比较容易,而对于复杂的业务活动抽象资源并不是一个简单的事情。比如校验用户等级,转账,事务处理等,这些往往并不容易简单的抽象为资源。 其次如果有严格的规范和标准定义要求,而且前期规范标准需要指导多个业务系统集成和开发的时候,SOAP风格由于有清晰的规范标准定义是明显有优势的。我们可以在开始和实现之前就严格定义相关的接口方法和接口传输数据。 简单数据操作,无事务处理,开发和调用简单这些是使用REST架构风格的优势。而对于较为复杂的面向活动的服务,如果我们还是使用REST,很多时候都是仍然是传统的面向活动的思想通过转换工具再转换得到REST服务,这种使用方式是没有意义的。效率和易用性 SOAP协议对于消息体和消息头都有定义,同时消息头的可扩展性为各种互联网的标准提供了扩展的基础,WS-*系列就是较为成功的规范。但是也由于SOAP由于各种需求不断扩充其本身协议的内容,导致在SOAP处理方面的性能有所下降。同时在易用性方面以及学习成本上也有所增加。 REST被人们的重视,其实很大一方面也是因为其高效以及简洁易用的特性。这种高效一方面源于其面向资源接口设计以及操作抽象简化了开发者的不良设计,同时也最大限度的利用了Http最初的应用协议设计理念。同时,在我看来REST还有一个很吸引开发者的就是能够很好的融合当前Web2.0的很多前端技术来提高开发效率。例如很多大型网站开放的REST风格的API都会有多种返回形式,除了传统的xml作为数据承载,还有(JSON,RSS,ATOM)等形式,这对很多网站前端开发人员来说就能够很好的mashup各种资源信息安全性 技术没有好坏,只有是不是合适,一种好的技术和思想被误用了,那么就会得到反效果。REST和SOAP各自都有自己的优点,同时如果在一些场景下如果去改造REST,其实就会走向SOAP(例如安全)。 REST对于资源型服务接口来说很合适,同时特别适合对于效率要求很高,但是对于安全要求不高的场景。而SOAP的成熟性可以给需要提供给多开发语言的,对于安全性要求较高的接口设计带来便利。所以我觉得纯粹说什么设计模式将会占据主导地位没有什么意义,关键还是看应用场景。 同时很重要一点就是不要扭曲了REST现在很多网站都跟风去开发REST风格的接口,其实都是在学其形,不知其心,最后弄得不伦不类,性能上不去,安全又保证不了。成熟度 SOAP虽然发展到现在已经脱离了初衷,但是对于异构环境服务发布和调用,以及厂商的支持都已经达到了较为成熟的情况。不同平台,开发语言之间通过SOAP来交互的web service都能够较好的互通。 由于没有类似于SOAP的权威性协议作为规范,REST实现的各种协议仅仅只能算是私有协议,当然需要遵循REST的思想,但是这样细节方面有太多没有约束的地方。REST日后的发展所走向规范也会直接影响到这部分的设计是否能够有很好的生命力。2023-07-08 12:09:011
如何设计好的RESTful API
一个好的RESTful API,应该具备以下特征: 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 1.浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。 REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。 按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。 2.如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。 这个API应该是松耦合的。 RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。 3.当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。 这个API中所使用的表述格式应该是常见的通用格式 在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。 4.这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。 使用HTTP响应状态代码来表达各种出错情况 HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。 5.如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。 这个API应该对于HTTP缓存是友好的2023-07-08 12:09:471
一个好的RESTfulAPI,具备特征
一个好的RESTfulAPI,应该具备以下特征:这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。1.浏览器是最常见和最通用的REST客户端。好的RESTfulAPI应该能够使用浏览器HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTfulAPI的功能组合起来,建造Mashup类的应用。这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTfulAPI的核心内容。RESTfulAPI建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTfulAPI建模的过程,可以看作是具有统一接口约束的面向对象建模过程。按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。2.如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTfulAPI来说并没有什么害处。这个API应该是松耦合的。RESTfulAPI的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTfulAPI的松耦合性。3.当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。这个API中所使用的表述格式应该是常见的通用格式在RESTfulAPI中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。4.这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。使用HTTP响应状态代码来表达各种出错情况HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:statuscode和reasonphase。两部分都是可定制的,也可以使用标准的statuscode,只定制reasonphase。5.如果一个所谓的“RESTfulAPI”对于任何请求都返回200OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。这个API应该对于HTTP缓存是友好的6.充分利用好HTTP缓存是RESTfulAPI可伸缩性的根本。HTTP协议是一个分层的架构,从两端的useragent到originserver之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。2023-07-08 12:09:541
如何设计好的RESTful API 之好的RESTful API 特征
一个好的RESTful API,应该具备以下特征: 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 1.浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。 REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。 按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。 2.如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。 这个API应该是松耦合的。 RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。 3.当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。 这个API中所使用的表述格式应该是常见的通用格式 在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。 4.这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。 使用HTTP响应状态代码来表达各种出错情况 HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。 5.如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。 这个API应该对于HTTP缓存是友好的 6.充分利用好HTTP缓存是RESTful API可伸缩性的根本。HTTP协议是一个分层的架构,从两端的user agent到origin server之间,可以插入很多中间组件。而在整个HTTP通信链条的很多位置,都可以设置缓存。HTTP协议内建有很好的缓存机制,可以分成过期模型和验证模型两套缓存机制。如果API设计者完全没有考虑过如何利用HTTP缓存,那么这个API的可伸缩性会有很多问题。2023-07-08 12:10:031
restful api怎么使用session
App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那样用cookie来保存session, 因此用session token来标示自己就够了,session/state由api server的逻辑处理。 如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session. 可以在app里嵌入webkit,用一个隐藏的browser来管理cookie session. session 和 oauth token 并不矛盾,作为身份认证 token 安全性比session好,因为每个请求都有签名还能防止监听以及重放攻击,而session就必须靠链路层来保障通讯安全了。如上所说,如果你需要实现有状态的会话,仍然可以增加session来在服务器端保存一些状态2023-07-08 12:10:121
如何设计好的RESTful API
一个好的RESTful API,应该具备以下特征: 这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。 1.浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。 这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。 REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。 按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。 2.如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。 这个API应该是松耦合的。 RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。 3.当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。2023-07-08 12:10:212