Resource
所谓"资源",就是网络上的一个实体,或者说是网络上的具体信息,它可以是一段文本,一张图片,一首歌曲,一种服务,
总之就是一个具体的实在,你可以 用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI,要获取这个资源,
访问它的URI就饿可以了,因此URI就成了每一个资源的地址或独一无二的识别符。
总结:
一:在网络上,一切皆资源。
二:每一种资源都有一个特定的URI指向它。
Resentation
"资源"是一种信息实体,它可以有多种外在表现形式,我们把"资源"具体呈现出来的形式,叫做它的变现层(Representation)
比如:文本可以用txt格式表现,也可以用HTML格式,ML格式, Json格式 , 表现。
URI只代表资源的实体,不代表它的形式,它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,
这两个字段才是对"表现层"的描述。
总结:
一:资源以什么样的表现形式呈现出来,这个就叫它的表现出。
二:资源的表现层,一般都是在请求头信息中体现出来。
State Transfer
访问一个网站,就代表了客户端和服务器的一个互动过程,在这个过程中,势必涉及到数据和状态的转换。
互联网通信协议HTTP协议,是一个无状态的协议,这意味着,所有的状态都保存在服务器端,因此,如果客户端想要操作服务器,
必须通过某种手段,让服务器端发生状态转化,而这种转化是建立在表现出之上的,所以就是表现层状态的转化。
总结:
一:在客户端和服务器的交互过程中,涉及到状态转化,我们是通过某种手段(ajax form)让它进行转化。
Uniform Interface
统一接口
REST要求,必须通过统一的接口来对资源执行各种操作,对于每个资源只能执行一组有限的操作。
HTTP1.1协议为例:
7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
http头信息(可自定义)
HTTP响应状态代码(可自定义)
这些就是HTTP1.1协议提供的统一接口
REST还要求,对于资源执行的操作,其操作语义必须由HTTP消息体之前的部分完全表达,不能将操作封装在HTTP消息体内部。
总结:
1:我们会使用7个HTTP方法来体现我们现在对资源的操作不再在地址上体现。
系统的接口
系统的接口:很多情况下,需要把系统的功能作为服务暴露给外部的其他应用使用或者给移动端使用,
就需要把系统中的服务作为接口暴露出来,一般分为工共接口(发短信,天气服务,)和私用接口(公司内部使用的)。
路径又称终点"endpoint",标识具体API的具体网址
接口设计原则
在REST架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所有的名词往往与数据库的表格名对应,
一般来说数据库中的表都是同种记录的集合"collection",所以URI中的名词也应该使用复数。
如:
http://aliwo.cn/vi/zoos 动物园资源
http://aliwo.cn/vi/animals 动物资源
总结:
一:设计资源的接口,接口URI选用的是名词,一般和数据库表名相同,并且使用复数。
抽象出来的接口:/images 图片资源的接口 post上传,delete 删除
动作设计原则
1:GET(SELECT) :从服务器取出资源(一项或多项)
2:POST(CREATE):在服务器新建一个资源
3:PUT(UPDATE):在服务更新资源(客户端提供改变后的完整资源)PUT更新整个对象。
4:PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性),PATCH更新个别属性
5:DELETE(DELETE):从服务器删除资源。
6:HEAD:获取一个资源的元数据,比如一个资源的hash值或者最后修改的日期。
7:OPTIONS:获得客户端对一个资源能够实施的操作,(获取该资源的api(能够对资源做什么操作的描述))
接口设计
常见状态码
处理put或patch,delete请求方法时的处理方案
代码解析使用Restful架构风格的Controll层设计
package com.live5.project.project_user.controller;
import com.live5.project.project_user.entity.User;
import com.live5.project.project_user.service.UserService;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.apache.ibatis.session.SqlSessionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import javax.swing.*;
import java.sql.SQLException;
/**
* package_name:com.live5.project.project_user.controller
*
* @author:徐亚远 Date:2020/3/20 21:57
* 项目名:live5_project_user
* Description:TODO
* Version: 1.0
**/
@Controller
@RequestMapping(value = "/users")
@ResponseBody
public class UserController {
@Autowired
private UserService userService;
/**
* updateById 方法的作用简述
*
* @param user
* @param modelMap
* @return
* @deprecated 通过id修改用户信息 支持restFul Api put请求
*/
@RequestMapping(value = "/", method = RequestMethod.PUT)
public User updateById(User user, ModelMap modelMap) throws Exception {
try {
return userService.updateUserById(user);
} catch (RuntimeException e) {
e.printStackTrace();
return null;
}
}
/**
* registUser 方法的作用简述
*
* @param user
* @return
* @throws Exception
* @deprecated 注册用户信息 支持restFul风格,post请求 pid可以为空,但是pid的值唯一
*/
@RequestMapping(value = "/regist", method = RequestMethod.POST)
public User registUser(@RequestBody User user) throws Exception {
try {
return userService.regist(user);
} catch (RuntimeException e) {
e.printStackTrace();
return null;
}
}
/**
* deleteById 方法的作用简述
* @deprecated 通过id删除用户信息,restApi delete请求
* @param id
* @return
* @throws Exception
*/
@RequestMapping(value = {"/del/{id}"}, method = RequestMethod.DELETE)
public String deleteById(@PathVariable Integer id) throws Exception {
try {
Boolean flag = userService.deleteByUserId(id);
if (flag) {
return "删除成功通过id";
}
} catch (RuntimeException e) {
e.printStackTrace();
}
return "删除失败通过id";
}
/**
* deleteByUsername 方法的作用简述
* @deprecated 通过username 删除用户信息,username唯一 rest Api delete请求
* @param username
* @return
*/
@RequestMapping(value = "/{username}", method = RequestMethod.DELETE)
public String deleteByUsername(@PathVariable String username) {
try {
Boolean flag = userService.deleteByUsername(username);
if (flag){
return "通过用户名删除成功";
}
} catch (Exception e) {
e.printStackTrace();
}
return "通过用户名删除失败";
}
/**
* login 方法的作用简述
* @deprecated 登录功能
* @param username
* @param password
* @return
* @throws Exception
*/
@RequestMapping(value = "/",method = RequestMethod.POST)
public User login(String username,String password) throws Exception {
User user = userService.login(username,password );
if (user!=null){
return user;
}
return null;
}
}