美文网首页
初步学习RESTful

初步学习RESTful

作者: Noah牛YY | 来源:发表于2017-08-24 23:14 被阅读7次

背景介绍

概念

URI

统一资源定位符, 表示一个资源在互联网中的位置, 一起都可以是资源, 比如一个标, 一个用户等

表现层

表现层指的是资源的格式, 比如: html, json等, 一般 URI 是没有后缀的, 我们加上的后缀实际上是表现层的东西

方法

GET, POST 等, 我们要删除一个资源的时候是直接表现在 URL 中的, 但是标准的 REST 规范是使用方法进行删除

方法及其作用

方法名 作用
GET(SELECT) 从服务器取出资源(一项或多项)。
POST(CREATE) 在服务器新建一个资源。
PUT(UPDATE) 在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE) 在服务器更新资源(客户端提供改变的属性【补丁】)。
DELETE(DELETE) 从服务器删除资源。
HEAD 获得一个资源的元数据,比如一个资源的hash值或者最后修改日期;
OPTIONS 获得客户针对一个资源能够实施的操作;

方法及其返回值

方法名 返回值
GET /zoos 列出所有动物园
POST /zoos 新建一个动物园
GET /zoos/ID 获取某个指定动物园的信息
PUT /zoos/ID 更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID 更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID 删除某个动物园
GET /zoos/ID/animals 列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID 删除某个指定动物园的指定动物

方法及其返回值类型

方法名 返回值类型
GET /collection 返回资源对象的列表(数组)
GET /collection/resource 返回单个资源对象
POST /collection 返回新生成的资源对象
PUT /collection/resource 返回完整的资源对象
PATCH /collection/resource 返回完整的资源对象
DELETE /collection/resource 返回一个空文档

状态码及其含义

状态码 含义
200 OK - [GET] 服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH] 用户新建或修改数据成功。
202 Accepted - [*] 表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE] 用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH] 用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*] 表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*] 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET] 用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET] 用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*] 服务器发生错误,用户将无法判断发出的请求是否成功。

测试方法

谷歌浏览器安装「postman」应用

操作

搭建 SSM 项目之后, 编写 Controller

请求方式的改变

1. 请求一个列表「GET」

「web.xml」中 Spring MVC 匹配的路径是 *.do

  • 方法: 「get」
  • URL: /emps
/**
 * 员工控制器
 * Created by nyy on 2017/8/24.
 */
@RestController //相当于 @Controller + @ResponseBody
@RequestMapping("/emps") //这个控制器的方法的路径的前缀
public class EmployeeController {

    /**
     * 获取所有的员工
     *
     * @return
     */
    @RequestMapping(method = RequestMethod.GET)
    public List<Employee> getEmployees() {
        List<Employee> emps = new ArrayList<>();
        emps.add(new Employee(1L, "Hanzo"));
        emps.add(new Employee(2L, "Genji"));
        return emps;
    }
}

使用 GET 请求

GET方式

使用 POST 方式请求

POST方式请求

2. 请求一个数据「GET」

已经将「web.xml」中 Spring MVC 匹配的路径改为 /

/**
 * 获取一个员工
 *
 * 路径中的「{}」是匹配参数, 在方法的形参列表中使用 @PathVariable 标签指定要将路径中的参数指定给那个形参
 * @param id
 * @return
 */
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Employee getEmployee(@PathVariable("id") Long id) {
    return new Employee(id, "Genji");
}

使用 GET 请求

获取一个员工

3. 更新一个数据「PUT|PATCH」

   /**
     * 更新一个员工对象
     *
     * @param id
     * @param name
     * @return
     */
    @RequestMapping(method = RequestMethod.PUT)
    public Employee update(Long id, String name) {
        return new Employee(id, name);
    }

使用 PUT 加上参数请求

更新数据

4. 删除一个数据「DELETE」

    /**
     * 删除一个员工对象
     *
     * @param id
     * @return
     */
    @RequestMapping(method = RequestMethod.DELETE)
    public AjaxResult update(Long id) {
        return new AjaxResult("删除成功, id为:" + id);
    }

使用 DELETE 格式删除数据

删除数据

5. 创建一个数据「POST」

    /**
     * 创建一个员工对象
     *
     * @param id
     * @param name
     * @return
     */
    @RequestMapping(method = RequestMethod.POST)
    public Employee create(Long id, String name) {
        return new Employee(id, name);
    }

使用 POST 创建对象

创建数据

请求头/实体头的改变

Accept 和 Content-Type

  • Accept 属于请求头, Content-Type 属于实体头。

Http 报头分为通用报头,请求报头,响应报头和实体报头。

  • 请求方的 http 报头结构:通用报头|请求报头|实体报头

  • 响应方的 http 报头结构:通用报头|响应报头|实体报头

  • Accept 代表发送端(客户端)希望接受的数据类型. 比如:

Accept:text/xml;

代表客户端希望接受的数据类型是xml类型

  • Content-Type 代表发送端(客户端|服务器)发送的实体数据的数据类型. 比如:
Content-Type:text/html;

代表发送端发送的数据格式是html。

  • 二者合起来
Accept:text/xml;
Content-Type:text/html

即代表希望接受的数据类型是 xml 格式,本次请求发送的数据的数据格式是html。

Accept

xml数据

    /**
     * 希望返回xml类型的数据
     *
     * @return
     */
//  @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/xml")
    @RequestMapping(method = RequestMethod.GET, produces = "application/xml")
    public void createByXml(HttpServletResponse response) {
        response.setContentType("application/xml");
        try {
            response.getOutputStream().write("<Employee><id>1</id><username>D.VA</username></Employee>"
                    .getBytes("utf-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

测试结果

请求xml格式数据

json数据

    /**
     * 希望返回json类型的数据
     *
     * @return
     */
//  @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
    public AjaxResult createByJson() {
        return new AjaxResult("请返回 json 格式");
    }

测试结果

设置请求头的Accept为json

Content-Type

表单类型

image.png

等同于

image.png

表示使用普通表单提交数据

    /**
     * 携带表单类型的数据
     *
     * @return
     */
    @RequestMapping(method = RequestMethod.POST, headers = "Content-Type=application/x-www-form-urlencoded")
    public Employee contentTypeForm(Employee employee) {
        return employee;
    }

测试结果

image.png

Json 数据

    /**
     * 携带json类型的数据
     *
     * @return
     */
    @RequestMapping(method = RequestMethod.POST, headers = "Content-Type=application/json")
    public Employee contentTypeJson(@RequestBody Employee employee) {
        return employee;
    }

测试结果

携带json数据

页面中的操作

上边都是测试工具中改变类型的, 那么怎么在实际应用中改变提交参数的类型和提交方式, 往下看

改变表单的提交方式

普通表单请求

「web.xml」中先配置

    <!-- 改变表单的提交方式 -->
    <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>

JSP 中给表单加一个隐藏域

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表单提交</title>
</head>
<body>
<form action="/emps" method="post">
    <input type="hidden" name="_method" value="DELETE">
    <input type="text" name="id" value="1">
    <input type="text" name="username" value="D.VA">
    <input type="submit">
</form>
</body>
</html>

使用异步请求

异步请求只要设置请求的类型就好

        $(function () {
            $("#click").click(function () {
                $.ajax({
                    url: '/emps',
                    type: 'DELETE',
                    dataType: 'json',
                    success: function (data) {
                        alert(data);
                    }
                })
            });
        })

参考项目: 码云查看

相关文章

  • 初步学习RESTful

    背景介绍 概念 URI 统一资源定位符, 表示一个资源在互联网中的位置, 一起都可以是资源, 比如一个标, 一个用...

  • 初步认识RESTful api

    场景:当项目逐渐庞大接口多了,这时接口怎样才便于管理呢? 参考资料:RESTful API 设计指南 因此必须有一...

  • 全栈工程师移动开发实践━MyEclipse激活

    上一篇我们介绍了Restful与Spring Boot初步配置,有些同学反馈MyEclipse未能激活,My...

  • Restful网络架构

    1.理解Restful2.跟着GitHub学习Restful3.GitHub API

  • Django 框架之 Restful框架

    知识点 Restful API介绍 Django Restful Framework介绍 实例学习 简介 Rest...

  • 059-整合JAX-RS and Jersey

    JAX-RS初步介绍 JAX-RS 是代表restful web service的一套规范API,JAX-RS规范...

  • Restful学习

    1.Rest简介 REST是英文representational state transfer(表象性状态转变)或...

  • 学习Restful

    总是听说Restful,但是一直没有具体的研究,今天把这个事情办了。 什么是Rest和Restful 简单的讲,它...

  • restful学习

    本文章的第四点通过实战一个 php+restfulAPI 设计例子来加深对restful的学习,那部分最实用重要,...

  • Elasticsearch 使用 RESTful API 聚合查

    上一篇我们学习了使用 RESTful API 进行常规查询,这一篇我们来学习使用 RESTful API 进行聚合...

网友评论

      本文标题:初步学习RESTful

      本文链接:https://www.haomeiwen.com/subject/kebnrxtx.html