Restful 风格

什么是 RESTful

Restful 是一种 web 软件架构风格,它不是标准也不是协议,它倡导的是一个资源定位及资源操作的风格。

  • 什么是 REST
    REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是HTTP 规范的主要编写者之一。在目前主流的三种 Web 服务交互方案中,REST 相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。它本身并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。

  • Restful 的优点
    它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

  • Restful 的特性
    资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
    它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
    表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层(Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
    状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。
    HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种手段,让服务器端发生 “状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT 、DELETE 。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

RESTful 的示例

rest是一个url请求的风格,基于这种风格设计请求的url

  • 没有rest的话,原有的url设计
    http://localhost:8080/user/queryUserById.action?id=3
    url中定义了动作(操作),参数具体锁定到操作的是谁
  • 有了rest风格之后
    rest中,认为互联网中的所有东西都是资源,既然是资源就会有一个唯一的uri标识它,代表它 http://localhost:8080/user/3 代表的是id为3的那个用户记录(资源)
    rest风格带来的直观体现:就是传递参数方式的变化,参数可以在uri中了,也可以根据请求方式的不同,做不同的操作
    /account/1 HTTP GET :得到 id = 1 的 account
    /account/1 HTTP DELETE:删除 id = 1 的 account
    /account/1 HTTP PUT:更新 id = 1 的 account
    URL:资源定位符,通过URL地址去定位互联网中的资源(抽象的概念,比如图片、视频、app服务等)。

RESTful 风格 URL

互联网所有的事物都是资源,要求URL中只有表示资源的名称,没有动词。

RESTful风格资源操作

使用HTTP请求中的method⽅法put、delete、post、get来操作资源。分别对应添加、删除、修改、查询。不过一般使用时还是 post 和 get。put 和 delete几乎不使用。

RESTful 风格资源表述

可以根据需求对URL定位的资源返回不同的表述(也就是返回数据类型,比如XML、JSON等数据格式)。

Spring MVC 对 RESTful 风格请求的支持

具体讲的就是使用 @PathVariable 注解获取 RESTful 风格的请求URL中的路径变量

  • inxex.jsp(put 和 delete 请求方式需要加隐藏域)

SpringMVC对Restful风格url的支持

测试用例:SpringMVC对Restful风格url的支持

rest_get测试
  • DemoController.java(对应的controller)
// @RequestMapping(value = "/handle/{id}",method = {RequestMethod.GET})
@GetMapping("/handle/{id}")
public ModelAndView handleGet(@PathVariable("id") Integer id) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}

// @RequestMapping(value = "/handle",method = {RequestMethod.POST})
@PostMapping("/handle")
public ModelAndView handlePost(String username) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}


// @RequestMapping(value = "/handle/{id}/{name}",method = {RequestMethod.PUT})
@PutMapping("handle/{id}/{name}")
public ModelAndView handlePut(@PathVariable("id") Integer id, @PathVariable("name") String username) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}

// @RequestMapping(value = "/handle/{id}",method = {RequestMethod.DELETE})
@DeleteMapping("/handle/{id}")
public ModelAndView handleDelete(@PathVariable("id") Integer id) {
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}
  • web.xml 配置乱码过滤器,以及处理请求类型的过滤器


    encoding
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    




    hiddenHttpMethodFilter
    org.springframework.web.filter.HiddenHttpMethodFilter



    encoding
    /*



    hiddenHttpMethodFilter
    /*

你可能感兴趣的:(Restful 风格)