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协议? - 基 ...
随机推荐
- Docker最全教程——从理论到实战(十七)
前言 上一篇我们通过实战分享了使用Go推送钉钉消息,由于技痒,笔者现在也编写了一个.NET Core的Demo,作为简单的对照和说明. 最后,由于精力有限,笔者希望有兴趣的朋友可以分享下使用CoreR ...
- 关于Javascript闭包的理解
以下内容属个人理解,如有看不明白或漏洞之处,纯属水平不佳,还望见谅. 关于闭包,高程里的定义是:指有权访问另一个函数作用域中的变量的函数.创建闭包最常见的方法就是在一个函数的内部再创建一个函数. 这里 ...
- yii2 钩子函数
插入时间 public function beforeSave($insert) { $this->created_at=time(); return parent::beforeSave($i ...
- CodeForces 1144A
原题链接:https://vjudge.net/problem/CodeForces-1144A #include<bits/stdc++.h> using namespace std; ...
- cf 水管问题
原题链接:https://vjudge.net/contest/331120#problem/E 原文英语: You are given a system of pipes. It consists ...
- gazebo仿真踩坑--rviz中设定机器人的目标位置,move_base后台日志报错
启动仿真环境及各种节点(amcl,move_base,map_server)后,在rviz中设定机器人的目标位置,后台日志报错 [ INFO] [1571974242.864525935, 40.51 ...
- H3C虚拟化技术
一.IRF简单介绍 IRF(Intelligent Resilient Framework,智能弹性架构)是H3C自主研发的软件虚拟化技术.它的核心思想是将多台设备连接在一起,进行必要的配置后,虚拟化 ...
- [HNOI2001] 求正整数 - 背包dp,数论
对于任意输入的正整数n,请编程求出具有n个不同因子的最小正整数m. Solution (乍一看很简单却搞了好久?我真是太菜了) 根据因子个数计算公式 若 \(m = \prod p_i^{q_i}\) ...
- Angular 相关概念
1.XMLHttpRequest 对象(属于xmlJavascript) XMLHttpRequest 对象用于在后台与服务器交换数据. Ajax 是对XMLHttpRequest 的封装,XMLHt ...
- Session方法
Session的save()和persist()方法Session的save()方法使一个临时对象转变为持久化对象.它完成以下操作:(1)将临时对象加入到Session缓存中,使其进入持久化状态.(2 ...