RESTful学习

什么是RESTful风格

        REST是一种设计API的模式。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,使用JSON格式的REST风格的API具有简单、易读、易用的特点。满足这些约束条件和原则的应用程序或设计就是 RESTful 应用。

为什么使用这套风格

虽然客户端有很多种类,但只要服务端统一提供API接口,多个客户端局域相同的协议哟用来调用该API即可获取数据。

不同的开发者对API接口的设计习惯不同,就会出同一个功能不同的API,如下:

新增员工:
http://localhost/employee/save
http://localhost/employee/add
http://localhost/employee/new
http://localhost/employee/xinzeng
http://localhost/employee/append
http://localhost/employee?cmd=add

所以,RESTful风格的API诞生了。

RESTful设计

1.网络上的所有事物都被抽象为资源

        每个资源都有一个唯一的资源定位符(URI)。每个URI代表一种资源(resource),所以URI中不能有动词,只能有名词,而且所用的名词往往与数据库的表名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以URI中的名词也应该使用复数。如下:

https://api.example.com/depts :部门资源
https://api.example.com/employees :员工资源
https://api.example.com/zoos :动物园资源
https://api.example.com/animals : 动物资源

2.资源状态转换

        访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到资源和资源状态变化。

        互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有资源的状态都保存在服务器端。因此,如果客户端想要操作服务器,须使用HTTP方法去促使服务器端资源发生状态改变。

        改变(服务器端)资源的状态

http://www.wolfcode.cn/employees

新增:员工资源 从无到有 状态的变化

更新:员工资源 从某个状态变成另外一种状态的转换

删除:员工资源 从有到无 状态的变化

3.使用统一接口

REST要求,必须通过统一的接口来对资源执行各种操作。

HTTP1.1协议为例: 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS

GET(SELECT):从服务器取出资源(一项或多项)。

POST(CREATE):在服务器新建一个资源。

PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。PUT更新整个对象

PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性【补丁】)。 PATCH更新个别属性

DELETE(DELETE):从服务器删除资源。

//了解

HEAD:获得一个资源的元数据,比如一个资源的hash值或者最后修改日期;

OPTIONS:获得客户端针对一个资源能够实施的操作;(获取该资源的api(能够对资源做什么操作的描述))

例子

对员工表的增删查改

@Controller
public class EmployeeController{

/**
     * RESTful风格接口设计
     *
     * 1.请求路径,在操作类型对象名后加s 作为访问路径资源  如 对员工对象进行操作https://localhost:8080/employees
     * 2.请求方法 GET查,POST存,DELETE删,PUT改
     * 3.请求参数
     * 4.请求响应  建议响应JSON格式数据
     */

/**
     * 查询员工
     * 请求路径 /employees
     * 请求方式 查 GET
     * 请求参数 无
     * 请求响应 JSON
     * @return
     */
    @RequestMapping(value = "/employees",method = RequestMethod.GET)
    @ResponseBody
    public Employee select(){
        return new Employee(1L,"人间一两风",23);
    }
 /**
     * 新增员工对象
     * 请求路径  /employees
     * 请求方式 存 POST
     * 请求参数  id,name,age
     * 请求响应 Employee对象 JSON
     */

    @RequestMapping(value = "/employees",method = RequestMethod.POST)
    @ResponseBody
    public Employee save(Long id, String name,Integer age){
        return new Employee(id,name,age);
    }
/**
     * 更新员工信息
     * 请求路径 /employees
     * 请求方式 更新 PUT
     * 请求参数 Employee
     * 请求响应 Employee对象 JSON
     */
    @RequestMapping(value = "/employees",method = RequestMethod.PUT)
    @ResponseBody
    public Employee save(Employee employee){
        return new Employee(employee.getId(), employee.getName(), employee.getAge());
    }
/**
     * 根据id删除员工对象
     * 请求路径 /employees
     * 请求方式 删 DELETE
     * 请求参数 id
     * 请求响应 结果对象(code,msg,data) JSON
     */
    @RequestMapping(value = "/employees",method = RequestMethod.DELETE)
    @ResponseBody
    public AjaxJson delete(Long id){
        //return AjaxJson.success(id);
        return AjaxJson.error(" "+id);
    }
}

使用参数路径的方式进行操作

     URL组成 : 协议://IP地址:端口/路径?参数1=值1&参数2=值2... 
     传统带参访问方式:
         接口:/employees  
         访问路径 http://localhost:8080/employee?id=1&name=人间一两风&age=23
     使用参数路径访问方式:
         接口:/employees/{id}/{name}/{age}   
         http://localhost:8080/employee/1/rjylf/23

        也可以很合使用 : 接口:/employees/{id}

                 http://localhost:8080/employee/1?name=人间一两风&age=23 只有id作为路径参数,所以只需要对id进行@PathVariable 注解即可

@Controller
public class EmployeeController{

   
    // 传统访问路径  http://localhost:8080/employees?id=1&name=rjylf&age=23
    @RequestMapping(value = "/employees",method = RequestMethod.PUT)
    @ResponseBody
    public Employee update(Long id, String name,Integer age){
        return new Employee(id,name,age);
    }

    // 参数路径访问  http://localhost:8080/employees/1/rjylf/23
    @RequestMapping(value = "/employees/{id}/{name}/{age}",method = RequestMethod.PUT)
    @ResponseBody
    public Employee update(Long id, String name,Integer age){
        return new Employee(id,name,age);
    }

    // 混合使用  http://localhost:8080/employees/1?name=rjylf&age=23
    @RequestMapping(value = "/employees/{id}",method = RequestMethod.PUT)
    @ResponseBody
    public Employee update(@PathVariable() Long id,  String name,Integer age){
        return new Employee(id,name,age);
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值