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 API 设计约定

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

在spring中使用webservice(Restful风格)

某小公司RESTful共用接口前后端分离接口约定的实践

某小公司 RESTful共用接口前后端分离接口约定的实践

利用express搭建一个restful api 服务器