RESTful让你优雅的定义接口

目录

 一、RESTful初识

二、RESTful设计

三、RESTful服务开发


资源来源:https://www.bilibili.com/video/BV1et411T7SS   可以跟着这位老师学习,讲的不错的。

结合这张图来对RESTful做了解:

 一、RESTful初识

REST(【Resource】Representational State Transfer):表现层状态转化
REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful


综合上面的解释,我们总结一下什么是RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过HTTP提供的统一接口,对服务器端资源进行操作,实现"表现层(使用HTTP动词去促使服务器端资源的)状态转化"。

二、RESTful设计

1、资源设计

       在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。

说明:v1:为版本号。目的:可以方便产品做升级

https://api.example.com/v1/zoos:动物园资源
https://api.example.com/v1/animals:动物资源
https://api.example.com/v1/employees:饲养员资源

2、动作设置 

按照HTTP方法的语义来暴露资源 ,有这些动作:

GET(SELECT)       : 从服务器取出资源(一项或多项)。
POST(CREATE)    : 在服务器新建一个资源。
PUT(UPDATE)      : 在服务器更新资源(客户端提供改变后的完整资源)。 
DELETE(DELETE): 从服务器删除资源。

3、返回结果

对于上面的动作,我们可以在处理完成的时候,设置相应的相应码标志完成或异常处理  

参考该博客:https://www.cnblogs.com/nosqlcoco/p/5562107.html

在HttpServletResponse这个类也有相应的常量对应。如:

public static final int SC_OK = 200;

public static final int SC_CREATED = 201;

public static final int SC_ACCEPTED = 202;
https://api.example.com/v1/employees 对于这个资源路径,按照SpringMVC设计对应

@RequestMapping("v1/employees")
@RestController   
public class EmployeeController {

    @GetMapping//4.3以后版本  
    public List<Employee> list(){
       //指定GET方法获取资源
    }

    @PostMapping("{employeeId}/salaries")
    public Salary addOneSalary(Salary salary){
       //给员工添加一条薪资记录
    } 
    
    @PutMapping("{id}")
    public void update(Employee employee){
       //更新一条员工记录。利用ajax发送请求时,要利用httpPutFormContentFilter过滤器处理
                            要不然发送来的参数会是null
       /* 在处理put patch请求时要对设置一个过滤器httpPutFormContentFilter
       * HttpPutFormContentFilter过滤器会自动的封装前台传递过来的PUT请求的参数,
       * 如果不配置HttpPutFormContentFilter过滤器的话,那么tomcat便不会自主的分封装PUT请求的参 
       * 数。*/
       
    }   
    @DeleteMapping("{id}")
    public void delById(@PathVariable("id") Long id, HttpServletResponse response){
        //删除一条记录
    }
}

 

三、RESTful服务开发

使用SpringMVC开发RESTful服务,就讲解些SpringMVC常用的注解把。

 1、@Controller  和 @RestController  及  @ResponseBody

RestController接口继承了Controller接口,并且还注入了ResponseBody注解。因此,在单页面的数据获取中,我们可以直接在这个类中标注RestController注解很方便。

 2、@RequestMapping    里面含有restful风格的动作注解

--------@GetMapping   

           @GetMapping   等价于  @RequestMapping(value = "employees",method = RequestMethod.GET)其他也类似。

--------@PatchMapping 

           Patch方式是对put方式的一种补充; put方式是可以更新.但是更新的是整体.patch是对局部更新;

注:SpringMVC在对于ajax发送的 put、patch请求时要对设置一个过滤器httpPutFormContentFilter,上面有提及。

  <!--  HttpPutFormContentFilter过滤器对 put patch请求参数进行处理-->
  <filter>
    <filter-name>httpPutFormContentFilter</filter-name>
    <!--  我们写的过滤的地址   -->
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>httpPutFormContentFilter</filter-name>
    <servlet-name>springmvc</servlet-name>
  </filter-mapping>

---------@PutMapping、@PostMapping

          我们常用的请求是post跟get,而REST风格的URL还有put跟delete请求,这四种请求对应的是数据库的CURD。 通常的浏览器都只是支持post跟get,这时候就需要HiddenHttpMethodFilter 过滤器来将post请求转换为put跟delete请求。

利用from表单的形式发送put请求

对于表单而言 method只有post、get因此我们要做一下处理设置隐藏提交方式提交put请求
<form action="/employees/1" method="post">
    <input type="hidden" name="_method" value="put">
    <input name="name" type="text"/><!-- 隐藏提交方式,实际上提交的是put -->
    <button>提交</button>
</form>
HiddenHttpMethodFilter过滤器来将post请求转换为put跟delete请求。  _method  拦截器定义的属性:private String methodParam = "_method";
  <filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <!--  我们写的过滤的地址   -->
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <servlet-name>springmvc</servlet-name>
  </filter-mapping>

3、@RequestMapping的参数化  


详情参见:https://blog.csdn.net/weixin_43453386/article/details/83419060 

4、@PathVariable 

映射 URL 绑定的占位符,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过

@PathVariable("xxx") 绑定到操作方法的入参中 。如:

   /*
    *     @JsonFormat(pattern = "yyyy-mm-dd",timezone = "GEM+8")  :后台返回给前台时间的注解
    */
    @GetMapping("{employeeId}/salaries/{month}")
    public Salary getSalary(@PathVariable Long employeeId,@PathVariable             
                                    @DateTimeFormat(pattern = "yyyy-mm-dd") Date month){
        return  new Salary(1l,employeeId, BigDecimal.TEN,month);
    }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值