概念:

什么是REST?

REST是Representational State Transfer的缩写。翻译为"表现层状态转化",restful是一种接口设计风格,它不是一个协议,通常是基于HTTP协议的;

为什么需要这么一个风格呢?

RESTful的重点之一就是统一的接口命名规则;

每个开发者可能会有不同的接口风格,最常见的就类似于于getUserInfo,deleteUserInfo等等.....,但是这个纯粹是跟每个开发者的习惯有关,多人协同开发时就可能会产生问题,特别是前后台分离时,前台人员不得不填写大量各不相同的url来请求数据;

RESTful风格:

rest将每一个URI都看作是一个资源,这是一个概念,实际可以是一个图片,一条记录,一组记录都可以; 每一种请求方法都对应着对某个资源的操作,通常包含以下四种:

  • GET 获取资源
  • PUT 更新资源
  • POST 提交资源
  • DELETE 删除资源

假设我们将id为1的用户数据看做是一个资源,那么我们要在前台操作这个资源时就要向服务器发送能够定位这个资源的请求地址,如:http://localhost:8080/SSMDemo/user/1 ,通过URI找到资源后,我们还要告诉服务器我们要对这个资源进行什么样的操作,就通过HTTP的请求方法;如GET

简单的说:RESTful就是用URI来定位资源,在通过请求方法来定义要执行的操作;

目前而言完全按照RESTful来设计的网站并不多,亚马逊算是最早采用这种风格的网站之一,它的URL是像这样:https://www.amazon.cn/gp/product/B00MCW8R1S

RESTful的无状态性:

无状态约束使服务器的变化对客户端是不可见的,两次连续的请求中,客户端不依赖于同一台服务器,这使得服务器具备更好的伸缩性;

RESTful为系统带来的好处:

降低开发的复杂性,提高系统的可伸缩性,使得接口更加规范化;

URI与URL:

URL是统一资源标识 (只要能唯一标识一个资源就叫做URI)

URL是统一资源路径

URL属于URI的一种

SpringMVC中的RESTful

可以看出来,RESTful的变化在于,请求地址的处理,以及请求方法的定义;

我们有两个事情要做:

  • 需要从URL中获取一些参数
  • 使得同一个接口的不同请求方法可以完成对应的操作

案例:设计一个对课程资源进行操作的RESTful接口

编写controller

package com.kkb.controller;

import com.kkb.pojo.Course;
import com.kkb.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; @RestController
public class RESTCourseController { @Autowired
CourseService service; //获取全部课程
@RequestMapping(value = "/course",method = RequestMethod.GET)
public List<Course> getCourseList(){
System.out.println("getCourseList");
return service.selectCourses();
}
//根据id获取某个课程
@RequestMapping(value = "/course/{id}",method = RequestMethod.GET)
public Course getCourse(@PathVariable Integer id){
System.out.println("getCourse");
System.out.println("参数:"+id);
return service.selectByID(id);
}
//添加新的课程
@RequestMapping(value = "/course",method = RequestMethod.POST)
public String addCourse(@RequestBody Course course){
System.out.println("addCourse");
System.out.println("参数:"+course);
service.insertCourse(course);
return "{\"msg\":\"success\"}";
}
//根据id删除课程
@RequestMapping(value = "/course/{id}",method = RequestMethod.DELETE)
public String deleteCourse(@PathVariable Integer id){
System.out.println("deleteCourse");
System.out.println("参数:"+id);
service.deleteCourse(id);
return "{\"msg\":\"success\"}";
}
//根据id更新课程
@RequestMapping(value = "/course",method = RequestMethod.PUT)
public String updateCourse(@RequestBody Course course){
System.out.println("updateCourse");
System.out.println("参数:"+course);
service.updateCourse(course);
return "{\"msg\":\"success\"}";
}
}

@PathVariable是专门用于从url中获取参数的,在RequestMapping中添加{参数名称},作为占位符, 参数名称需要与方法中的参数名称相同,若不同可以为@PathVariable添加value(通常没必要这么做),像下面这样:

  @RequestMapping(value = "/course/{cid}",method = RequestMethod.GET)
public Course getCourse(@PathVariable("cid") Integer id){
System.out.println("getCourse");
System.out.println("参数:"+id);
return service.selectByID(id);
}

接口测试推荐使用postman mac可使用paw,

另外在实际开发中我们需要前台传递用户令牌,以验证身份;可以通过拦截器来实现;

补充:

Tomcat 只会解析get和post中的参数,若SpringMVC中使用了PUT或是DELETE,并且使用的是表单提交,那么将无法获取参数,应为Tomcat没有经参数接续出来放到request中,SpringMVC提供了一个过滤器,专门帮助tomcat解析put/delete中的参数并放入request中,配置方法如下:

web.xml:

<!--配置SpringMVC,解析PUT/DELETE的表单数据放入request-->
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

上述的问题在使用json交互时不会出现,因为SpringMVC是直接从请求体中获取json数据的,不通过request;

啰嗦:如果页面上的表单使用了PUT/或DELETE请求方式,就需要在web.xml中加入上面的过滤器;

SpringMVC开发RESTful接口的更多相关文章

  1. 007 使用SpringMVC开发restful API五--异常处理

    一:任务 1.任务 Spring Boot中默认的错误机制处理机制 自定义异常处理 二:Spring Boot中的默认错误处理机制 1.目前 浏览器访问的时候, restful 接口主要是根据状态码进 ...

  2. 004 使用SpringMVC开发restful API二--编写用户详情

    一:编写用户详情服务 1.任务 @PathVariable隐射url片段到java方法的参数 在url声明中使用正则表达式 @JsonView控制json输出内容 二:@PathVariable 1. ...

  3. 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义

    一:任务 1.任务 常用的验证注解 自定义返回消息 自定义校验注解 二:Hibernate Validator 1.常见的校验注解 2.程序 测试类 /** * @throws Exception * ...

  4. 005 使用SpringMVC开发restful API三--处理创建请求

    一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@Reques ...

  5. 003 使用SpringMVC开发restful API--查询用户

    一:介绍说明 1.介绍 2.restful api的成熟度 二:编写Restful API的测试用例 1.引入spring的测试框架 在effective pom中查找 2.新建测试包,测试类 3.测 ...

  6. Spring Boot 2.x (十):构建优雅的RESTful接口

    RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约束条 ...

  7. 让SpringMVC支持可版本管理的Restful接口

    需求 移动互联网时代的到来,软件开发的模式也在变化.记得以前做B/S的后台开发,基本上没有Http接口一说,全部是通过渲染模板技术(jsp,freemark)把最终html展示给最终用户.现在完全变了 ...

  8. springmvc/springboot开发restful API

    非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...

  9. python 全栈开发,Day100(restful 接口,DRF组件,DRF跨域(cors组件))

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确.方便快速开发 - 针对pc,手机,ipad,微信,支付宝... 使用同一个接口 2. 简述http协议? - 基 ...

随机推荐

  1. JS添加和删除表格行

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  2. BZOJ 3438 小M的礼物

    BZOJ 3438 小M的礼物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...

  3. Python中io的open()在PyCharm环境下报错和路劲的问题

    PS:我也是初学者,上班空闲时间学习学习Python.今天学到io的时候,遇到了两个用PyCharm环境编写代码的小白错误,如下: 两个问题都是如下代码: 1. 第一个问题:当写好代码之后,点击运行报 ...

  4. substring && substr

    let string = '0123456';string.substring(0,3);//start: number, end?: number 012(而非 0123)string.substr ...

  5. 用windows 画图 裁剪照片

    图片大小432*312 1.裁剪大小:打开画图--找到矩形选择 形状裁剪完之后,像素会有相应的变化 2.单纯调整像素:  打开画图----重新调整大小(去掉保持纵横比之后可以任意调整大小) 题目:上传 ...

  6. 2019ICPC南昌站E.Bob's Problem

    题意: 一张图,n个点,m条边分为黑边和白边,黑边任意选,白边只能选k条,在保持整张图连通的情况下使得所选变的权值和最大 解析: 因为边权全部是正值,所以可以把黑边全选上,缩点之后对各个连通块和白边进 ...

  7. 远程执行本地脚本_linux

    一.远程执行脚本 1.免机器指纹确认(无需填写yes/no) ssh -o StrictHostKeyChecking=no root@192.168.108.78 2.远程执行本地脚本 ssh -o ...

  8. [CF1304E] 1-Trees and Queries - LCA

    由于可以走重边,所以任意一条路径长 + 2 仍然对应至少一条合法路径 很显然我们有 \(3\) 种基本路径 不经过 \((x,y)\) 经过 \(x \to y\) 经过 \(y \to x\) 假设 ...

  9. Spring Boot整合Freemarker

    一.首先导入依赖 <!-- 添加freemarker模版的依赖 --> <dependency>     <groupId>org.springframework. ...

  10. spring boot MySQL Public Key Retrieval is not allowed

    建议在链接url处添加对应的属性 jdbc:mysql://localhost:3306/book?allowPublicKeyRetrieval=true&useSSL=false