REST api架构

简介:
RESTful架构,就是目前最流行的一种互联网软件架构 。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

REST优势

REST改善了用户接口跨多个平台的可移植性,并且通过简化服务器组件,改善了系统的可伸缩性。最为关键的是通过分离用户接口和数据存储这两个关注点,使得不同用户终端享受相同数据成为了可能。

1. 无状态性

无状态性是在客户-服务器约束的基础上添加的又一层规范。他要求通信必须在本质上是无状态的,即从客户到服务器的每个request都必须包含理解 该request所必须的所有信息。这个规范改善了系统的可见性(无状态性使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前 request,而不必了解所有的request历史),可靠性(无状态性减少了服务器从局部错误中恢复的任务量),可伸缩性(无状态性使得服务器端可以 很容易的释放资源,因为服务器端不必在多个request中保存状态)。同时,这种规范的缺点也是显而易见得,由于不能将状态数据保存在服务器上的共享上 下文中,因此增加了在一系列request中发送重复数据的开销,严重的降低了效率。

2. 缓存

为了改善无状态性带来的网络的低效性,我们填加了缓存约束。缓存约束允许隐式或显式地标记一个response中的数据,这样就赋予了客户端缓存 response数据的功能,这样就可以为以后的request共用缓存的数据,部分或全部的消除一部分交互,增加了网络的效率。但是用于客户端缓存了信 息,也就同时增加了客户端与服务器数据不一致的可能,从而降低了可靠性。

B/S架构的优点是其部署非常方便,但在用户体验方面却不是很理想。为了改善这种情况,我们引入了REST. REST在原有的架构上增加了三个新规范:统一接口,分层系统和按需代码。

3. 统一接口

REST架构风格的核心特征就是强调组件之间有一个统一的接口,这表现在REST世界里,网络上所有的事物都被抽象为资源,而REST就是通过通用 的链接器接口对资源进行操作。这样设计的好处是保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性。并且REST针对 Web的常见情况做了优化,使得REST接口被设计为可以高效的转移大粒度的超媒体数据,这也就导致了REST接口对其它的架构并不是最优的。

4. 分层系统

分层系统规则的加入提高了各种层次之间的独立性,为整个系统的复杂性设置了边界,通过封装遗留的服务,使新的服务器免受遗留客户端的影响,这也就提高了系统的可伸缩性。

5. 按需代码

REST允许对客户端功能进行扩展。比如,通过下载并执行applet或脚本形式的代码,来扩展客户端功能。但这在改善系统可扩展性的同时,也降低了可见性。所以它只是REST的一个可选的约束。

 

REST规范接口

每个资源都有对应的URI,不同的HTTP Method对应的对资源不同的操作,GET(读取资源信息)、POST(添加资源)、PUT(更新资源信息)、DELETE(删除资源)。几乎所有的计算机语言都可以通过HTTP协议同REST服务器通信。

Java代码   收藏代码
  1. GET /tickets # 获取ticket列表  
  2. GET /tickets/12 # 查看某个具体的ticket  
  3. POST /tickets # 新建一个ticket  
  4. PUT /tickets/12 # 更新ticket 12.  
  5. DELETE /tickets/12 #删除ticekt 12  

如果关系依托于另外一个资源,Restful原则提供了很好的指导原则。让我们来看一个例子。SupportFu的一个ticket包含许多消息(message)。这些消息逻辑上与/tickets接入点的映射关系如下:

  • GET /tickets/12/messages - 获取ticket #12下的消息列表
  • GET /tickets/12/messages/5 - 获取ticket #12下的编号为5的消息
  • POST /tickets/12/messages - 为ticket #12创建一个新消息
  • PUT /tickets/12/messages/5 - 更新ticket #12下的编号为5的消息
  • PATCH /tickets/12/messages/5 - 部分更新ticket #12下的编号为5的消息
  • DELETE /tickets/12/messages/5 - 删除ticket #12下的编号为5的消息

结果过滤,排序和搜索

GET /tickets?sort=-priority - 获取票据列表,按优先级字段降序排序

 

场景:

  • A:http://www.nowamagic.net/articles
  • B:http://www.nowamagic.net/articles/{id}

A网址:GET方法:显示全部用户信息;同时有个POST方法,用来添加用户;

B网址:GET方法:显示当前用户信息;PUT方法:更新用户信息;DELETE方法:删除该用户信息。

 注意RESTClient form的enctype属性x-www-form-urlencoded,form-data 是文件上传

最常见的一种设计错误,就是URI包含动词 因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。

如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:

Java代码   收藏代码
  1. POST/accounts/1/transfer/500/to/2  

 正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:

Java代码   收藏代码
  1. POST/transaction  
  2.   
  3. HTTP/1.1  
  4. Host: 127.0.0.1  
  5. from=1&to=2&amount=500.00  

另一个设计误区,就是在URI中加入版本号:

Java代码   收藏代码
  1. http://www.example.com/app/1.0/foo  
  2. http://www.example.com/app/1.1/foo  

因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分

Java代码   收藏代码
  1. Accept: vnd.example-com.foo+json; version=1.0  
  2. Accept: vnd.example-com.foo+json; version=1.1  

二、处理返回值。 返回值要么是JSON格式,要么是XML格式。

PHP如何获取rest的HTTP的请求PUT或DELETE的数据

Java代码   收藏代码
  1. $method = $_SERVER['REQUEST_METHOD']; //请求  
  2. $rawbody = file_get_contents("php://input");  
  3. $form = json_decode($rawbody, true); //数据  

前端 MVC 框架支持

在 AngularJS 中原生提供了 RESTful 的操作接口。也可以用jQuery的Ajax,浏览器支持不好

Java代码   收藏代码
  1. //注意:Jquery其它HTTP请求方法,如PUT和DELETE 也可以使用,但仅部分浏览器支持。  
  2. //getOne or delete  
  3. $.ajax({  
  4.     url:'/api/work/1',  
  5.     type:"GET"//DELETE  
  6.     success:function(data) {  
  7.       console.log(data);  
  8.     },  
  9.     error:function (xhr, ajaxOptions, thrownError){  
  10.       console.log(xhr.responseText);  
  11.     }   
  12.   });  
  13.   
  14. var postData = {  
  15.     "title""title31",  
  16.     "author_id""31",  
  17.     "content""content31",  
  18.     "create_time""2013-08-20 09:23:14"  
  19. };  
  20. //create or update  
  21. $.ajax({  
  22.     url:'/api/work',  
  23.     data:JSON.stringify(postData)  
  24.     type:"POST"//PUT  
  25.     success:function(data) {  
  26.         console.log(data);  
  27.     },  
  28.     error:function (xhr, ajaxOptions, thrownError){  
  29.         console.log(xhr.responseText);  
  30.     }   
  31. });  

sfsd

相关文章
|
7天前
|
安全 Java API
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)(上)
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)
27 0
第7章 Spring Security 的 REST API 与微服务安全(2024 最新版)(上)
|
29天前
|
前端开发 JavaScript API
基于React的简易REST API客户端设计与实现
基于React的简易REST API客户端设计与实现
21 3
|
2月前
|
缓存 安全 API
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
公司对外开放的OpenAPI-Server服务,作为核心内部系统与外部系统之间的重要通讯枢纽,每天处理数百万次的API调用、亿级别的消息推送以及TB/PB级别的数据同步。经过多年流量的持续增长,该服务体系依然稳固可靠,展现出强大的负载能力。
56 9
【亿级数据专题】「高并发架构」盘点本年度探索对外服务的百万请求量的API网关设计实现
|
11天前
|
监控 JavaScript 安全
构建微服务架构下的API网关
【4月更文挑战第15天】在微服务架构中,API网关扮演着至关重要的角色。它作为系统的唯一入口,不仅负责请求的路由、负载均衡和认证授权,还涉及到监控、日志记录和服务熔断等关键功能。本文将探讨如何构建一个高效且可靠的API网关,涵盖其设计原则、核心组件以及实现策略,旨在为后端开发人员提供一套实用的指导方案。
26 4
|
1月前
|
消息中间件 缓存 API
微服务架构下的API网关性能优化实践
在现代的软件开发中,微服务架构因其灵活性和可扩展性被广泛采用。随着服务的细分与增多,API网关作为微服务架构中的关键组件,承担着请求路由、负载均衡、权限校验等重要职责。然而,随着流量的增长和业务复杂度的提升,API网关很容易成为性能瓶颈。本文将深入探讨API网关在微服务环境中的性能优化策略,包括缓存机制、连接池管理、异步处理等方面的具体实现,旨在为开发者提供实用的性能提升指导。
|
1月前
|
缓存 负载均衡 监控
构建高效微服务架构:API网关的作用与实践
【2月更文挑战第31天】 在当今的软件开发领域,微服务架构已成为实现系统高度模块化和易于扩展的首选方法。然而,随着微服务数量的增加,确保通信效率和管理一致性变得尤为重要。本文将探讨API网关在微服务架构中的核心角色,包括其在请求路由、安全性、负载均衡以及聚合功能方面的重要性。我们将通过具体案例分析,展示如何利用API网关优化后端服务,并讨论实施过程中的最佳实践和常见挑战。
|
1月前
|
缓存 监控 负载均衡
构建微服务架构下的API网关实践指南
【2月更文挑战第22天】在现代的软件开发实践中,微服务架构因其灵活性和可扩展性而成为众多企业的首选。随着服务数量的增长,有效地管理这些服务的入口——API网关,成为了确保系统稳定性和效率的关键。本文将探讨如何在微服务环境中构建一个高性能、可扩展的API网关,以及它如何帮助实现请求路由、负载均衡、认证授权和监控等功能,同时提供了一系列实施的最佳实践和面临的挑战解决方案。
|
1月前
|
监控 测试技术 API
构建基于微服务架构的高效API网关
【2月更文挑战第20天】 在现代软件架构中,微服务已成为企业开发云原生应用的首选模式。随着服务数量的增长,有效的服务管理和请求路由变得至关重要。本文将探讨如何构建一个高效的API网关来管理微服务架构中的服务交互,重点讨论其设计原则、关键组件以及实现方法。通过引入API网关,我们旨在简化客户端与服务的通信,提供统一的访问入口,增强安全性,并提升系统的可扩展性和维护性。
|
1月前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
60 1
|
3月前
|
XML JSON API
浅谈6种流行的API架构风格
浅谈6种流行的API架构风格

热门文章

最新文章