RESTful开发方式

Posted Do_GH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RESTful开发方式相关的知识,希望对你有一定的参考价值。

文章目录

REST表现层状态转换,资源在网络中以某种表现形式进行状态转移,而RESTful是基于REST理念的一套开发风格的具体的开发规则。

在原来的开发过程中一般使用JSP来渲染前端页面,这样的做法只适用于PC端的能够解析html页面的程序而移动端则并不适用,所以提出了REST的开发规则。REST的核心就是将前后端解耦,后台控制器只需要向前端传递数据,前端的渲染工作完全由前端来处理。

RESTful

REST要求适用URL作为用户交互的入口,URL必须具有明确的语义,必须适用名词作为路径,要符合扁平化最好不要超过两级目录而且名词要区分单数和复数。同时要明确请求的类型(GET|POST|PUT|DELETE),除了GET|POST请求外,还有两种不常用的请求PUT-用于处理新增请求,DELETE-用于处理删除请求。在响应过程中,REST要求只返回数据(JSON|XML)不包含任何展现。

示例:

package com.restful.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/restful")
public class TestController 
    @GetMapping("/request")
    @ResponseBody
    public String doGetRequest() 
        return "\\"message\\":\\"获取Get请求\\"";
    

    @PostMapping("/request")
    @ResponseBody
    public String doPostRequest() 
        return "\\"message\\":\\"获取Post请求\\"";
    

    @PutMapping("/request")
    @ResponseBody
    public String doPutRequest() 
        return "\\"message\\":\\"获取Put请求\\"";
    

    @DeleteMapping("/request")
    @ResponseBody
    public String doDeleteRequest() 
        return "\\"message\\":\\"获取Delete请求\\"";
    



在Spring 4.x之后,Spring MVC提供了@RestController注解,该注解为@Controller的增强版,增加该注解后控制器内所有请求都会以响应体的形式返回,不需要再在方法上使用@ResponseBody注解。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/jquery-3.3.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function ()
            $("#btnGet").click(function () 
                $.ajax(
                    url : "/restful/request",
                    type : "GET",
                    dataType : "JSON",
                    success : function (json) 
                        $("#title").text(json.message);
                    
                );
            );
        );

        $(function ()
            $("#btnPost").click(function () 
                $.ajax(
                    url : "/restful/request",
                    type : "POST",
                    dataType : "JSON",
                    success : function (json) 
                        $("#title").text(json.message);
                    
                );
            );
        );

        $(function ()
            $("#btnPut").click(function () 
                $.ajax(
                    url : "/restful/request",
                    type : "PUT",
                    dataType : "JSON",
                    success : function (json) 
                        $("#title").text(json.message);
                    
                );
            );
        );

        $(function ()
            $("#btnDelete").click(function () 
                $.ajax(
                    url : "/restful/request",
                    type : "DELETE",
                    dataType : "JSON",
                    success : function (json) 
                        $("#title").text(json.message);
                    
                );
            );
        );

    </script>
</head>
<body>
<input type="button" id="btnGet" value="Get请求" />
<input type="button" id="btnPost" value="Post请求" />
<input type="button" id="btnPut" value="Put请求" />
<input type="button" id="btnDelete" value="Delete请求" />
<h1 id="title"></h1>
</body>
</html>

当前后端解耦后,前端就可以使用ajax异步接收JSON字符串并对页面进行渲染

路径变量注解

当需要查询某一个数据时,在Servlet中我们向访问地址添加参数,并通过getParamter()方法获取请求中的参数,而在Spring MVC中提供了路径变量,即在URI中书写需要查询的参数,并在控制器中获取,极大简便了请求的方法。例如:

    @PostMapping("/request/userId")
    public String doPostRequest(@PathVariable(value = "userId") Integer userId) 
        return "\\"message\\":\\"获取Post请求\\", \\"userId\\":" + userId + "";
    

在路径中使用包含的路径信息就被称为路径变量,在方法的参数中添加@PathVariable用于将路径参数注入到方法参数中,这样就可以取出路径中包含的信息用于其他业务处理。

前台的ajax对应修改为:

<script type="text/javascript">
$(function ()
    $("#btnPost").click(function () 
        $.ajax(
            url : "/restful/request/100",
            type : "POST",
            dataType : "JSON",
            success : function (json) 
                $("#title").text("message:" + json.message + ";userId:" + json.userId);
            
        );
    );
);
</script>

简单请求与非简单请求

简单请求就是常用的GET|POST两种请求类型,这两种请求都是标准的HTTP请求,而相对的PUT|DELETE请求就是非简单请求,是对HTTP请求的扩展。非简单请求相较于简单请求需要先完成预检请求,当预检请求成功后才会发送正式请求。

由于PUT|DELETE为两种新的请求方式,所以在Spring MVC中无法直接获取该类请求。但是Spring提供了表单转换的过滤器,只需要向web项目添加该过滤器就可以转换为对应的提交方式。例如:

在web.xml中添加过滤器

    <!-- 添加过滤器,处理PUT|DELETE请求 -->
    <filter>
        <filter-name>formContentFilter</filter-name>
        <filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>formContentFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    @PostMapping("/request/userId")
    public String doPostRequest(@PathVariable(value = "userId") Integer userId, Person person) 
        System.out.println(person);
        return "\\"message\\":\\"获取Post请求\\", \\"userId\\":" + userId + "";
    

    @PutMapping("/request")
    public String doPutRequest(Person person) 
        System.out.println(person);
        return "\\"message\\":\\"获取Put请求\\"";
    

JSON的反序列化

如果需要返回的是一个包含很多属性的对象,不可能手动的将属性拼接为JSON,所以一般会使用JSON将实体类转换为JSON格式。

引入Maven依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.9</version>
</dependency>

此时引入的是Jackson的jar包,是Spring MVC默认支持的,还可选用Google提供的Gson和阿里提供的fastjson

在Spring MVC中当加载了jar包后,控制器中如果返回的是一个实体类,会自动转换为JSON传递给前台,不需要再去手动序列化。示例:

    @GetMapping("findAll")
    public List<Person> findAll() 
        List<Person> list = new ArrayList<Person>();

        Person p1 = new Person();
        p1.setName("lily");
        p1.setAge(23);
        p1.setBirthday(new Date());

        Person p2 = new Person();
        p2.setName("smith");
        p2.setAge(22);
        p2.setBirthday(new Date());
        list.add(p1);
        list.add(p2);

        return list;
    
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/jquery-3.3.1.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () 
            $("#btnGetPerson").click(function () 
                $.ajax(
                    url : "/restful/findAll",
                    type : "GET",
                    dataType : "JSON",
                    success : function (json) 
                        for (let i = 0; i < json.length; i++) 
                            var person = json[i];
                            $("#person").append("<h2>name:" + person.name + ";age:" + person.age + ";birthday:" + person.birthday + "</h2>")
                        
                    
                )
            );
        );

    </script>
</head>
<body>
<input type="button" id="btnGetPerson" value="获取人员信息" />
<div id="person"></div>
</body>
</html>

需要注意的是对于时间类型的属性需要添加@JsonFormat注解对时间进行格式化转换,而且需要指定当前时区,这是针对时间类型属性必须要进行的操作。示例:

package com.restful.entity;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;

public class Person 
    private String name;
    private Integer age;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date birthday;

    public Date getBirthday() 
        return birthday;
    

    public void setBirthday(Date birthday) 
        this.birthday = birthday;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    

以上是关于RESTful开发方式的主要内容,如果未能解决你的问题,请参考以下文章

restful架构风格设计准则资源识别的注意事项

Python Tornado搭建高并发Restful API接口服务

我应该对 REST 资源使用单数还是复数命名约定?

RESTful开发方式

RESTful开发方式

十一:时态