一、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的认识和用法的更多相关文章

  1. Android 开源框架

    不推荐使用UltimateAndroid.KJFrameForAndroid.ThinkAndroid.Afinal.xUtil等这种集成网络请求.图片加载.数据库ORM.视图依赖注入.UI框架等的集 ...

  2. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  3. restful用法

    http://www.cnblogs.com/wen-wen/p/6149847.html一.创建services文件夹services文件夹下1.BaseService.jsclass Servic ...

  4. angular中使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  5. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  6. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  7. Restful API

    http://www.ruanyifeng.com/blog/2011/09/restful 参考资料:-------以网络为基础的应用软件的架构设计. Restful API的设计与实践 字数218 ...

  8. 使用RAML描述API文档信息的一些用法整理

    RAML是Restful API Modeling Language的缩写,是用来描述API信息的文档. 创建一个.raml后缀的文件,用Atom打开. 基本用法 #%RAML 0.8 title: ...

  9. RESTFUL接口

    原文地址:http://kb.cnblogs.com/page/512047/ 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者 ...

随机推荐

  1. Hadoop4.2HDFS测试报告之四

    第二组:文件存储读过程记录 测试系统组成 存储类型 测试程序或命令 测试文件大小(Mb) 文件个数(个) 客户端并发数(个) 读速率 (M/s) NameNode:1 DataNode:1 本地存储 ...

  2. python小数据池,代码块深入剖析

    小数据池 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建更多的对象 缓存:int,str,bool int:缓存范围-5~256 str:    1.长度小于等于1,直接缓存 2.长度大于 ...

  3. dll和lib关系及使用

    对于dll和lib两者的关系,需要理解的一个概念是编译时和运行时.   lib是编译时的东西,在lib里面包含了方法名和方法所在的dll名字,可以用dumpbin -all XXX.lib查看内容. ...

  4. Chromium Embedded Framework

    关于CEF 近期由于工作需要开始研究了Google的Chromium Embedded Framework(CEF),这是一个基于Google Chromium开源代码的项目,使用CEF可以很方便的在 ...

  5. [转] NGINX宏观手记

    前言 任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总结.翻译.整理 ,希望你可以知道nginx不仅仅是PHP的附属品 ...

  6. loj2020 「HNOI2017」礼物

    所有的下标从 \(0\) 开始. 考虑枚举 \(C\) (第一个加上负的等于第二个加上其绝对值)和第二个手链的偏移量 \(p\).答案就是 \[\sum_{i=0}^{n-1}(x_i+C-y_{(i ...

  7. __block 和__weak

    1,在MRC 时代,__block 修饰,可以避免循环引用:ARC时代,__block 修饰,同样会引起循环引用问题: 2,__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修 ...

  8. oracle整体结构-内存结构、物理结构、逻辑结构、进程

    Oracle的体系结构大体上分为两部分:Instance(实例)和Database(数据库). Instance(实例) :在Oracle Instance中主要包含了SGA以及一些进程(例如:PMO ...

  9. 基于 FPGA 的图像边缘检测

    本文主要内容是实现图像的边缘检测功能 目录 mif文件的制作 调用 ip 核生成rom以及在 questasim 仿真注意问题 灰度处理 均值滤波:重点是3*3 像素阵列的生成 sobel边缘检测 图 ...

  10. LaTeX Hierarchical Tables

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/52692655 简单整理一下表格中的分级 ...