SpringMVC(十二)Restful架构风格

来源:互联网 发布:windows10服务极限优化 编辑:程序博客网 时间:2024/05/22 17:43

什么是REST:

  1. 表述性状态转移,分布式超媒体软件的 一种架构风格
  2. 一套简单的设计原则,一种架构风格或(模式),不是一种具体的标准或架构
  3. 基于使用HTTP、URI等现有的广泛流行的协议和标准,并由几个核心抽象概念支撑。

一、资源:任何事物,只要有被引用的必要,就是一个资源(resource)。它可以是一个事物,也可以是一个抽象的概念。
二、表示:资源和表示不是一码事,web上获取的不是资源,而是资源的表示。
三、状态:在客户-服务端模式下,让客户端维护应用状态,并确保客户端向服务器发出的请求都包含理解请求所需的全部信息。

约束和风格:核心是架构以资源为核心的模型 优点:具有更好的扩展性

  1. url表示资源
  2. CRUD操作
  3. 状态表述转移
  4. 无状态服务
  5. Http状态码
  6. Cache控制
  7. Proxy

关键原则:
1、为所有资源定义ID:
URI(统一资源定位符),URI构成了一个全局命名空间,使用URI标识的关键资源意味着它们获得了一个唯一、全局的ID。
总结:无论WEB中的资源代表单一数据项、数据项集合、虚拟或实际的对象还是计算结果等,都可以使用URI标识。

2、将所有资源链接在一起:
URI命名规格是全球标准,构成web的所有资源都可以互通通信。
总结:任何可能的情况下,使用连接指引可以被标识的资源。

3、使用标准方法
POST-Create GET-Read Put-Update DELETE-Delete
总结:为使客户端程序能与web中的的资源相互协议,资源应该正确地实现默认的应用协议(即HTTP协议),并使用协议标准的GET/PUT/POST/DELETE方法。

4、资源多重表示
总结:尽可能针对不同的需求提供资源多重表示

5、无状态通信
总结:要做到无状态通信往往需要一些重新设计-不能简单地将一些Session状态绑缚在URI上。

RESTful:符合REST约束风格和原则的应用程序或设计就是RESTfull
Spring对RESTful的支持:

  • @RequestMapping和@PathVariable注解,支持资源标识和URL映射

  • 目前互联网公司越来越流行提供RESTful形式的API供第三方调用

Token认证机制:
RESTful提供的API是无状态的,即下一次调用请求与当前的调用请求时完全无关的,但这就

无法保证系统资源的安全性。
Token机制(令牌机制)就是用来解决无状态和安全性之间的矛盾。
原理如下:
1、用户发送用户名和密码(一般密码加密),请求通过验证
2、服务器判断用户名和密码是否正确
3、服务器通过,返回Token即过期时间
4、所有请求携带返回的Token在过期时间内即可通过Token验证并正常使用RESTful API(服务器验证Token时间过期,则无法正常使用RESTful,需要从新验证)

代码测试:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Rest架构风格页面请求</title></head><body>            <!-- 由于表单不知道Update提交方式,这里只能只能写post -->    <form action="/user/order/1234" method="post">        <!-- 隐藏域可以被HideenHttpMethodFilter过滤器处理,从而修改请求操作方法 -->        <inpt type="hidden" name="_method" value="put">        <input type="text" name="name"></br>        <input type="text" name="age"></br>        <input type="submit" value="提交">    </form></body></html>
    <!-- 配置SpringMVC支持res架构风格过滤器 -->    <filter>        <filter-name>HiddenHttpMethodFilter</filter-name>        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>HiddenHttpMethodFilter</filter-name>        <servlet-name>SpingMVC</servlet-name>    </filter-mapping>
@Controllerpublic class RestfulAPIController {    @RequestMapping(value="/user/order/{id}",method=RequestMethod.PUT)    public String updateUserRestFulAPI(@PathVariable("id")String id,@RequestParam("name")String name) {        System.out.println(id);        System.out.println(name);        return "";    }}