RESTful 风格

理解REST架构风格与RESTful Web服务

英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。

目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。

目录

  • 1 宗旨
  • 2 要点及标准
    • 2.1 REST的要求
    • 2.2 关于状态
    • 2.3 RESTful Web 服务
  • 3 实现举例
  • 4 REST的优点
  • 5 实现
  • 6 参考资料

宗旨

REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表徵。获得这些表徵致使这些应用程序转变了其状态。随着不断获取资源的表徵,客户端应用不断地在转变着其状态,所谓表徵狀態轉移(Representational State Transfer)。

这一观点不是凭空臆造的,而是通过观察当前Web互联网的运作方式而抽象出来的。Roy Fielding 认为,

设计良好的网络应用表现为一系列的网页,这些网页可以看作的虚拟的状态机,用户选择这些链接导致下一网页传输到用户端展现给使用的人,而这正代表了状态的转变。

要点及标准

需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。

  • 资源是由URI来指定。
  • 对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。
  • 通过操作资源的表现形式来操作资源。
  • 资源的表现形式则是XML或者HTML,取决于读者是机器还是人,是消费web服务的客户软件还是web浏览器。当然也可以是任何其他的格式。

REST的要求

  • 客户端和服务器结构
  • 连接协议具有无状态性
  • 能够利用Cache机制增进性能
  • 层次化的系统
  • 隨需代碼 - Javascript (可選)

关于状态

应该注意区别应用的状态和连接协议的状态。REST对于连接的无状态性实际上要求每次經過无状态的连接协议传送的信息必須包含应用中所有的状态信息。

RESTful Web 服务

RESTful Web 服务(也称为 RESTful Web API)是一个使用HTTP并遵循REST原则的Web服务。它从以下三个方面资源进行定义:

  • URI,比如:http://example.com/resources/
  • Web服务接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等。
  • Web服务在该资源上所支持的一系列请求方法(比如:POST,GET,PUT或DELETE)。

该表列出了在实现RESTful Web 服务时HTTP请求方法的典型用途。

HTTP 请求方法在RESTful Web 服务中的典型应用 [1]
资源GETPUTPOSTDELETE
一组资源的URI,比如http://example.com/resources/ 列出 URI,以及该资源组中每个资源的详细信息(后者可选)。使用给定的一组资源替换当前整组资源。在本组资源中创建/追加一个新的资源。 该操作往往返回新资源的URL。 删除 整组资源。
单个资源的URI,比如http://example.com/resources/142 获取 指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等) 替换/创建 指定的资源。并将其追加到相应的资源组中。把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 删除 指定的元素。

PUT 和 DELETE 方法是幂等方法。GET方法是安全方法 (不会对服务器端有修改,因此也是幂等的)。

不像基于SOAP的Web服务,RESTful Web服务并没有的“正式”标准[2]。 这是因为REST是一种架构,而SOAP只是一个协议。虽然REST不是一个标准,但在实现RESTful Web服务时可以使用其他各种标准(比如HTTP,URL,XML,PNG等)。

实现举例

例如,一个简单的网络商店应用,

列举所有商品,

GET http://www.store.com/products

具体某一件商品,

GET http://www.store.com/product/12345

下单购买,

POST http://www.store.com/order
<purchase-order>
  <item> ... </item>
</purchase-order>

REST的优点

  • 可以利用缓存Cache来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好

来源:http://zh.wikipedia.org/wiki/REST

参考文献:http://www.restfulwebservices.cn/

### Restful 风格基本概念 Restful 是一种资源定位及资源操作的风格,并非标准或协议。基于该风格设计的软件更简洁、有层次,且易于实现缓存等机制。互联网中的所有事物都可抽象为资源,使用 POST、DELETE、PUT、GET 不同方法对资源进行操作,分别对应添加、删除、修改、查询 [^3]。 ### Java 后端使用 Restful 风格的语法 在 Java 后端开发中,常使用 Spring 框架实现 Restful 风格的 API。以下是一些关键语法和示例: #### 1. `@RequestMapping` 注解 `@RequestMapping` 是一个通用的请求映射注解,可用于类和方法上,用于指定请求的 URL 和 HTTP 方法。 ```java import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class RestfulContraller { // 之前的写法 @RequestMapping("/add") public String test(int a, int b, Model model) { int res = a + b; model.addAttribute("msg", "结果为" + res); return "test"; } } ``` #### 2. 更细化的 HTTP 方法注解 为了更清晰地表达请求的 HTTP 方法,Spring 提供了 `@GetMapping`、`@PostMapping`、`@PutMapping`、`@DeleteMapping` 等注解。 ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api") public class UserController { // 查询全部用户 @GetMapping("/users") public String getAllUsers() { return "获取所有用户"; } // 新增用户 @PostMapping("/users") public String createUser() { return "创建新用户"; } // 根据 ID 修改用户 @PutMapping("/users/{id}") public String updateUser(@PathVariable Long id) { return "更新用户,ID 为: " + id; } // 根据 ID 删除用户 @DeleteMapping("/users/{id}") public String deleteUser(@PathVariable Long id) { return "删除用户,ID 为: " + id; } } ``` #### 3. `@PathVariable` 注解 用于从 URL 中提取变量。 ```java import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class RestFulController { @RequestMapping(value = "/commit/{a}/{b}", method = {RequestMethod.POST}) public String RestFul2(@PathVariable int a, @PathVariable String b, Model model) { String res = a + b; model.addAttribute("msg", "post 结果为:" + res); return "rest"; } } ``` ### 总结 Java 后端使用 Restful 风格主要借助 Spring 框架的注解来实现资源的定位和操作,通过不同的 HTTP 方法和 URL 设计,使 API 更具可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值