目录

 一、RESTful初识

二、RESTful设计

三、RESTful服务开发



restful哪种接口调用方式最好 restful接口定义_rest

结合这张图来对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、返回结果

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

参考该博客:

在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注解很方便。

restful哪种接口调用方式最好 restful接口定义_服务器_02

restful哪种接口调用方式最好 restful接口定义_MVC_03

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

restful哪种接口调用方式最好 restful接口定义_MVC_04

--------@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的参数化  

restful哪种接口调用方式最好 restful接口定义_spring_05


详情参见: 

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);
    }