restful的认识和用法
一、restful的认识
1、基本概念
(1)REST指的是一组架构约束条件和原则。 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。REST的意思是资源的表述性状态转移
(2)先看REST是什么意思,英文Representational state transfer 表述性状态转移。其实就是对 资源 的表述性状态转移。
什么是表述性:就是指客户端请求一个资源,服务器拿到的这个资源,就是表述
资源的地址 在web中就是URL (统一资源标识符)
资源是REST系统的核心概念。 所有的设计都是以资源为中心
(3)RESTful架构与传统的RPC、SOAP等方式在理念上有很大的不同
(4)目的:实现客户端无需借助任何文档即能调用到所有的服务器资源。客户只可以通过服务端所返回各结果中所包含的信息来得到下一步操作所需要的信息,如到底是向哪个URL发送请求等。
2、规范和约束
RESTful 架构的核心规范与约束:统一接口。
分为四个子约束:
(1)每个资源都拥有一个资源标识,每个资源的资源标识可以用来唯一地标明该资源
就是写在controller上的访问路径
(2)消息的自描述性
比如Content-Type可以为application/x-www-form-urlencoded(标准的编码格式)、application/json、text/plain、application/xml、text/html
(3)资源的自描述性。
就是所带的参数
(4)超媒体作为应用状态引擎
一个网站里面肯定还有很多其他链接,链接到新链接,且链接容易被标识。
3、使用标准的状态码
(1)GET
安全且幂等
表示获取
200(OK) - 表示已在响应中发出
204(无内容) - 资源有空表示
301(Moved Permanently) - 资源的URI已被更新
303(See Other) - 其他(如,负载均衡)
304(not modified)- 资源未更改(缓存)
400 (bad request)- 指代坏请求(如,参数错误)
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
(2)POST
不安全且不幂等
创建子资源
部分更新资源
200(OK)- 如果现有资源已被更改
201(created)- 如果新资源被创建
202(accepted)- 已接受处理请求但尚未完成(异步处理)
301(Moved Permanently)- 资源的URI被更新
303(See Other)- 其他(如,负载均衡)
400(bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
(3)PUT
不安全但幂等
通过替换的方式更新资源
200 (OK)- 如果已存在资源被更改
201 (created)- 如果新资源被创建
301(Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他(如,负载均衡)
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
(4)DELETE
不安全但幂等
删除资源
200 (OK)- 资源已被删除
301 (Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他,如负载均衡
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
409 (conflict)- 通用冲突
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
二、具体使用
1、简单概括
url | 请求方式 | 作用 |
---|---|---|
/emp/{id} | GET | 查询一个员工 |
/emp | GET | 查询所有员工 |
/emp | POST | 保存一个员工 |
/emp/{id} | PUT | 修改一个员工 |
/emp/{id} | DELETE | 删除一个员工 |
2、根据id查询一个员工
------controller端-----
@RequestMapping("/emp/{empId}")
@ResponseBody
public Emp getEmpById(@PathVariable Long empId) {
Emp emp= empService.getEmpById(empId);
return emp;
}
<!--Emp就一个pojo-->
------serviceImpl端-----
@Override
public Emp getEmpById(long empId) {
Emp emp = empMapper.selectByPrimaryKey(empId);
return emp;
}
------前端的ajax-----
function getEmp(empId){
$.ajax({
url : "${Pro_Path}/emp/"+empId,
type : "GET",
//请求成功的回调函数
success : function(result) {
$("#一个input的id").val(result.empName);
}
});
}
3、查询所有员工
------controller端-----
<!-- 分页查询的参数:page传入页码,rows以及每页的大小-->
@RequestMapping("/emp/list")
@ResponseBody
public PageInfo getEmpList(Integer page, Integer rows) {
return empService.getEmpList(page, rows);
}
------serviceImpl端-----
public PageInfo getEmpList(int page, int rows) {
//设置分页信息
PageHelper.startPage(page, rows);
//执行查询
EmpExample example = new EmpExample();
List<Emp> list = empMapper.selectByExample(example);
//取查询结果
PageInfo<Emp> pageInfo = new PageInfo<>(list);
//返回结果
return pageInfo;
}
------前端的ajax-----
function to_page(page) {
$.ajax({
url : "${Pro_Path}/emp/list",
data: '{"page": page, "rows": 8}',
type : "GET",
//请求成功的回调函数
success : function(result) {
//数据表单展示:
$.each(result.list,function(index, item) {
//将表格内容显示出来
var checkBoxTd=$("<td><input type='checkbox'/></td>");
var empIdTd = $("<td></td>").append(item.empId);
var empNameTd = $("<td></td>").append(item.empName);
$("<tr></tr>").append(checkBoxTd).append(empIdTd).append(empNameTd).appendTo("#tbody的id");
});
页面情况展示:
$("#div的id").append("当前第" + result.pageNum + "页 共有" + result.pages+ "页 总计" + result.total + "条记录");
页数导航:
var ul = $("<ul></ul>");
$.each(result.navigatepageNums, function(index, item) {
var eachPgaeNumLi = $("<li></li>").append(
$("<a></a>").append(item));
//添加单击事件
eachPgaeNumLi.click(function() {
to_page(item);
});
ul.append(eachPgaeNumLi);
});
var navEle = $("<nav></nav>").append(ul);
navEle.appendTo("#div的id");
}
});
}
4、保存一个员工
------controller端-----
//保存员工(一般有用到jsr303校验)
@RequestMapping(value="/saveEmp",method=RequestMethod.POST)
@ResponseBody
public DataResult saveEmp(@Valid Employee employee,BindingResult result) {
if(result.hasErrors()) {
Map<String,Object> map=new HashMap<String,Object>();
//result校验失败,应该返回失败 ,在模态框中显示校验失败的错误信息
List<FieldError> errors=result.getFieldErrors();
for (FieldError fieldError : errors) {
map.put(fieldError.getField(), fieldError.getDefaultMessage());
}
DataResult.build( DataResult.error ,null, map);
}else {
return employeeService.saveEmp(employee);
}
}
<!--DataResult是一个处理结果的pojo,
包含属性 :
响应业务状态 private Integer status;
响应消息 private String msg;
响应中的数据 private Object data; -->
------serviceImpl端-----
public DataResult saveEmp(Employee employee) {
employeeMapper.insertSelective(employee);
return DataResult.ok();
}
------前端的ajax-----
$.ajax({
url:"${Pro_Path}/saveEmp",
type:"POST",
data:$("#form的id").serialize(),
success:function(result){
//保存成功后:
if(result.status==100){
。。。此处省略。。。
}else{
// 保存失败后
//如果有邮箱的错误信息
if(result.data.email!=undefined){
。。。此处省略。。。
}
//如果有用户名的错误
if(result.data.empName!=undefined){
。。。此处省略。。。
}
}
}
});
5、根据id修改员工
------controller端-----
/*
* 根据id修改员工
* 注意传递的id名字要和Employee 的属性名一样
*/
@RequestMapping(value="/updateEmp/{empId}",method=RequestMethod.PUT)
@ResponseBody
public DataResult updateEmp(Employee employee) {
return employeeService.updateEmp(employee);
}
------serviceImpl端-----
public DataResult updateEmp(Employee employee) {
employeeMapper.updateByPrimaryKeySelective(employee);
return DataResult.ok();
}
------前端的ajax-----
var id=$(this).attr("edit-id");
$.ajax({
url : "${Pro_Path}/updateEmp/"+id,
type : "POST",
data:$("#form的id").serialize()+"&_method=PUT",
success : function(result) {
}
});
6、删除一个员工
------controller端-----
@RequestMapping(value="/deleteEmpById/{id}",method=RequestMethod.DELETE)
@ResponseBody
public DataResult deleteEmpById(@PathVariable("id")Integer id) {
return employeeService.deleteEmpById(id);
}
------serviceImpl端-----
public DataResult deleteEmpById(Integer id) {
employeeMapper.deleteByPrimaryKey(id);
return DataResult.ok();
}
------前端的ajax-----
$.ajax({
url : "${Pro_Path}/deleteEmpById/"+empId,
type : "DELETE",
success : function(result) {
}
});
7、批量删除多个员工
------controller端-----
@RequestMapping(value="/deleteEmpsById/{ids}",method=RequestMethod.DELETE)
@ResponseBody
public ProcessMsg deleteEmpsById(@PathVariable("ids")String ids) {
//如果是多个id
if(ids.contains("-")) {
String[] str_id=ids.split("-");
List<Integer> list_id=new ArrayList<Integer>();
for(String item_id:str_id) {
list_id.add(Integer.parseInt(item_id));
}
return employeeService.deleteBatch(list_id);
//如果是一个id
}else {
return employeeService.deleteEmpById(Integer.parseInt(ids));
}
}
------serviceImpl端-----
public DataResult deleteBatch(List<Integer> str_id) {
EmployeeExample employeeExample=new EmployeeExample();
Criteria criteria=employeeExample.createCriteria();
criteria.andEmpIdIn(str_id);
employeeMapper.deleteByExample(employeeExample);
return DataResult.ok();
}
public DataResult deleteEmpById(Integer id) {
employeeMapper.deleteByPrimaryKey(id);
return DataResult.ok();
}
------前端的ajax-----
$("#emp_delete_all_btn").click(function() {
var del_id_str="";
$.each($(".check_item:checked"),function(){
del_id_str+=$(this).parents("tr").find("td:eq(1)").text()+"-";
});
//去除最后一个逗号,分号
del_id_str=del_id_str.substring(0 , del_id_str.length-1);
$.ajax({
url : "${Pro_Path}/deleteEmpsById/"+del_id_str,
type : "DELETE",
success : function(result) {
}
});
});
restful的认识和用法的更多相关文章
- Android 开源框架
不推荐使用UltimateAndroid.KJFrameForAndroid.ThinkAndroid.Afinal.xUtil等这种集成网络请求.图片加载.数据库ORM.视图依赖注入.UI框架等的集 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- restful用法
http://www.cnblogs.com/wen-wen/p/6149847.html一.创建services文件夹services文件夹下1.BaseService.jsclass Servic ...
- angular中使用ngResource模块构建RESTful架构
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
- angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- Restful API
http://www.ruanyifeng.com/blog/2011/09/restful 参考资料:-------以网络为基础的应用软件的架构设计. Restful API的设计与实践 字数218 ...
- 使用RAML描述API文档信息的一些用法整理
RAML是Restful API Modeling Language的缩写,是用来描述API信息的文档. 创建一个.raml后缀的文件,用Atom打开. 基本用法 #%RAML 0.8 title: ...
- RESTFUL接口
原文地址:http://kb.cnblogs.com/page/512047/ 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者 ...
随机推荐
- java web项目(spring项目)中集成webservice ,实现对外开放接口
什么是WebService?webService小示例 点此了解 下面进入正题: Javaweb项目(spring项目)中集成webservice ,实现对外开放接口步骤: 准备: 采用与spring ...
- LeetCode(238) Product of Array Except Self
题目 Given an array of n integers where n > 1, nums, return an array output such that output[i] is ...
- Nastya Studies Informatics CodeForces - 992B (大整数)
B. Nastya Studies Informatics time limit per test 1 second memory limit per test 256 megabytes input ...
- centos7 安全配置
CentOS是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事 ...
- Java获得字节码对象的三种方式
1.Class 类的forName方法 Class clazz = Class.forName("com.test.Test"); 该方法要注意的是会抛出一个ClassNotFou ...
- navicat for mysql 在win7下设置定时计划之导出数据处理
navicat for mysql 在win7下设置定时计划之导出数据处理 博客分类: mysql navitcatmysql定时任务导出 前两篇记录了,navicat for mysql计划的入门 ...
- 浅谈我所见的CSS命名风格
在两年工作中,总结一下我所见的css命名风格. 1.单一class命名 .header { width: 500px; } .item { text-indent: 20%; } 优点:简单,渲染效率 ...
- docker容器为什么可以跨平台部署
docker镜像和操作系统没关系,docker最大的价值就是提出了镜像打包技术.首先你的明白什么是docker,什么是镜像,什么是容器,然后你就能明白镜像和操作系统之间的关系.docker是一个引擎, ...
- 防止csrf
//防csrf攻击 $csrf_hash = md5(uniqid(rand(), TRUE)); set_cookie("my_csrf_name", $csrf_hash, 0 ...
- ubuntu14 安装和使用docker
Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互 ...