SpringMVC开发RESTful接口
概念:
什么是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接口的更多相关文章
- 007 使用SpringMVC开发restful API五--异常处理
一:任务 1.任务 Spring Boot中默认的错误机制处理机制 自定义异常处理 二:Spring Boot中的默认错误处理机制 1.目前 浏览器访问的时候, restful 接口主要是根据状态码进 ...
- 004 使用SpringMVC开发restful API二--编写用户详情
一:编写用户详情服务 1.任务 @PathVariable隐射url片段到java方法的参数 在url声明中使用正则表达式 @JsonView控制json输出内容 二:@PathVariable 1. ...
- 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义
一:任务 1.任务 常用的验证注解 自定义返回消息 自定义校验注解 二:Hibernate Validator 1.常见的校验注解 2.程序 测试类 /** * @throws Exception * ...
- 005 使用SpringMVC开发restful API三--处理创建请求
一:主要任务 1.说明 @RequestBody 映射请求体到java方法的参数 日期类型参数的处理 @Valid注解 BindingResult验证请求参数的合法性并处理校验结果 二:@Reques ...
- 003 使用SpringMVC开发restful API--查询用户
一:介绍说明 1.介绍 2.restful api的成熟度 二:编写Restful API的测试用例 1.引入spring的测试框架 在effective pom中查找 2.新建测试包,测试类 3.测 ...
- Spring Boot 2.x (十):构建优雅的RESTful接口
RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约束条 ...
- 让SpringMVC支持可版本管理的Restful接口
需求 移动互联网时代的到来,软件开发的模式也在变化.记得以前做B/S的后台开发,基本上没有Http接口一说,全部是通过渲染模板技术(jsp,freemark)把最终html展示给最终用户.现在完全变了 ...
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- python 全栈开发,Day100(restful 接口,DRF组件,DRF跨域(cors组件))
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确.方便快速开发 - 针对pc,手机,ipad,微信,支付宝... 使用同一个接口 2. 简述http协议? - 基 ...
随机推荐
- [转]从实例谈OOP、工厂模式和重构
有了翅膀才能飞,欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光,让僵冷的翅膀重新飞起来.结合实例,通过应用OOP.设计模式和重构,你会看到代码是怎样一 ...
- IDEA 接口调试插件 HTTP Client
界面客户端 使用手册 https://www.jetbrains.com/help/idea/testing-restful-web-services.html 打开方式 Tools -> HT ...
- 常用命令 在linux下
1.拷贝某个目录及其下的所有的文件到另外一个目录 语法:cp -r <source directory name>/ <destination directory name>/ ...
- 在vue项目中播放m3u8格式视频
前言:最近公司在做一个线上会议的项目,要求后台网站播放m3u8格式的视频,查找部分资料,总结一下,方便后边查阅 1.在vue工程中安装以下依赖: cnpm install video.js --sa ...
- SpringBoot学习- 6、MetaData描述无法tip显示问题
SpringBoot学习足迹 (一)先说说现象 1.在application.properties可以定义属性并在MetaData中增加description 如 生成additional-sprin ...
- Allegro 反射仿真--IBIS模型转化
一.IBIS模型的获取 a) 直接找芯片供应商 b) 从网上下载 i.到Google网站直接搜索某个型号的IBIS模型: ii. 到器件厂商的官方网站下载: iii.从专门提供IBIS模型的网站搜索下 ...
- C语言-防止输入字母
今天群里一位小伙伴问了一个关于scanf函数的问题: scanf("%d", &n); 这个代码怎么防止输入字母? 因为他下面是判断n是否为质数,所以这里肯定有个判断,不然 ...
- linux异常 - 弹出界面 eth0:设备eth0似乎不存在
问题描述: 用VMware vSphere Client复制虚拟机之后,出现这个问题 解决方法: service network stop service NetworkManager restart
- 1、spring与springmvc父子容器
转载于http://www.tianshouzhi.com/api/tutorials/spring 1.0 spring与springmvc父子容器 1.spring和springmvc父子容器概念 ...
- 140. 单词拆分 II
Q: 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中.返回所有这些可能的句子. 说明: 分隔时可以重复使用字典 ...