zoukankan      html  css  js  c++  java
  • RESTful到底是什么?

    RESTful

    RESTful起源

    REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新的架构风格(一种思想)。

    RESTful架构的主要原则

    • 对网络上所有的资源都有一个资源标志符。
    • 对资源的操作不会改变标识符。
    • 同一资源有多种表现形式(xml、json)
    • 所有操作都是无状态的(Stateless)

    符合上述REST原则的架构方式称为RESTful

    RESTful介绍

    RESTful是一种常见的REST应用,是遵循REST风格的web服务,REST式的web服务是一种ROA(面向资源的架构)。

    简单的说:RESTful是一种架构的规范与约束、原则,符合这种规范的架构就是RESTful架构。

    RESTful规范与约束

    RESTful 架构的核心规范与约束:统一接口
    分为四个子约束:
    1.每个资源都拥有一个资源标识,每个资源的资源标识可以用来唯一地标明该资源
    2.消息的自描述性
    3.资源的自描述性。
    4.HATEOAS Hypermedia As The Engine Of Application State(超媒体作为应用状态引擎)
    即客户只可以通过服务端所返回各结果中所包含的信息来得到下一步操作所需要的信息,如到底是向哪个URL发送请求等。也就是说,一个典型的REST服务不需要额外的文档标示通过哪些URL访问特定类型的资源,而是通过服务端返回的响应来标示到底能在该资源上执行什么样的操作

    目的:实现客户端无需借助任何文档即能调用到所有的服务器资源

    REST资源操作

    http方法 资源操作 幂等 安全
    GET SELECT
    POST INSERT
    PUT UPDATE
    DELETE DELETE

    RESTful中根据操作资源的不同,使用不同的http方法,其传输的媒介一般使用json

    RESTful设计准则

    宾语必须是名词

    宾语就是 API 的 URL,是 HTTP 动词作用的对象。它应该是名词,不能是动词。比如,/articles这个 URL 就是正确的,而下面的 URL 不是名词,所以都是错误的。

     /getAllCars
     /createNewCar
     /deleteAllRedCars
    

    复数URL

    既然 URL 是名词,那么应该使用复数,还是单数?
    这没有统一的规定,但是常见的操作是读取一个集合,比如GET /articles(读取所有文章),这里明显应该是复数。
    为了统一起见,建议都使用复数 URL,比如GET /articles/2要好于GET /article/2。

    避免多级URL

    常见的情况是,资源需要多级分类,因此很容易写出多级的 URL,比如获取某个作者的某一类文章。

      GET /authors/12/categories/2
    1
    

    这种 URL 不利于扩展,语义也不明确,往往要想一会,才能明白含义。
    更好的做法是,除了第一级,其他级别都用查询字符串表达。

      GET /authors/12?categories=2
    1
    

    下面是另一个例子,查询已发布的文章。你可能会设计成下面的 URL。

      GET /articles/published
    1
    

    查询字符串的写法明显更好。

      GET /articles?published=true
    

    接口示例

    传统的URL:

    http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据
    
    http://127.0.0.1/user/save POST 新增用户
    
    http://127.0.0.1/user/update POST 修改用户信息
    
    http://127.0.0.1/user/delete GET/POST 删除用户信息
    

    RESTful格式:

    http://127.0.0.1/user/{id} GET 根据用户id查询用户数据
    
    http://127.0.0.1/user POST 新增用户
    
    http://127.0.0.1/user PUT 修改用户信息
    
    http://127.0.0.1/user DELETE 删除用户信息  OR http://127.0.0.1/user/{id} DELETE 删除用户信息
    

    RESTful实践

    查询

    新增

    更新

    删除

    RESTful状态码

    GET
    安全且幂等
    获取表示
    变更时获取表示(缓存)
    200(OK) - 表示已在响应中发出
    204(无内容) - 资源有空表示
    301(Moved Permanently) - 资源的URI已被更新
    303(See Other) - 其他(如,负载均衡)
    304(not modified)- 资源未更改(缓存)
    400 (bad request)- 指代坏请求(如,参数错误)
    404 (not found)- 资源不存在
    406 (not acceptable)- 服务端不支持所需表示
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务端当前无法处理请求
    
    POST
    不安全且不幂等
    使用服务端管理的(自动产生)的实例号创建资源
    创建子资源
    部分更新资源
    如果没有被修改,则不过更新资源(乐观锁)
    200(OK)- 如果现有资源已被更改
    201(created)- 如果新资源被创建
    202(accepted)- 已接受处理请求但尚未完成(异步处理)
    301(Moved Permanently)- 资源的URI被更新
    303(See Other)- 其他(如,负载均衡)
    400(bad request)- 指代坏请求
    404 (not found)- 资源不存在
    406 (not acceptable)- 服务端不支持所需表示
    409 (conflict)- 通用冲突
    412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
    415 (unsupported media type)- 接受到的表示不受支持
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务当前无法处理请求
    
    
    PUT
    不安全但幂等
    用客户端管理的实例号创建一个资源
    通过替换的方式更新资源
    如果未被修改,则更新资源(乐观锁)
    200 (OK)- 如果已存在资源被更改
    201 (created)- 如果新资源被创建
    301(Moved Permanently)- 资源的URI已更改
    303 (See Other)- 其他(如,负载均衡)
    400 (bad request)- 指代坏请求
    404 (not found)- 资源不存在
    406 (not acceptable)- 服务端不支持所需表示
    409 (conflict)- 通用冲突
    412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
    415 (unsupported media type)- 接受到的表示不受支持
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务当前无法处理请求
    
    
    DELETE
    不安全但幂等
    删除资源
    200 (OK)- 资源已被删除
    301 (Moved Permanently)- 资源的URI已更改
    303 (See Other)- 其他,如负载均衡
    400 (bad request)- 指代坏请求
    404 (not found)- 资源不存在
    409 (conflict)- 通用冲突
    500 (internal server error)- 通用错误响应
    503 (Service Unavailable)- 服务端当前无法处理请求
    
    
    

    至此,RESTful的介绍和使用已经完成,RESTful已在各互联网公司接口定义中,成为主流的范式,RESTful减少了传统请求的拆装箱操作,结构清晰,在接口定义中受到前后端开发者的青睐。

    参考资源:博客园地址简书地址CSDN地址CSDN地址

    以上四篇文章都是质量非常之高的,以上内容只是为了个人查看方便,侵权请联系删除!

  • 相关阅读:
    django + dropzone.js 上传文件
    随机知识点---后续整理
    Python项目在Jenkins中的自动化测试实践(语法检查、单元测试,coverage(代码覆盖率)、自动打包)
    my read / zikao / nanjingdaxue
    OS + CentOS kernel parameter
    network / Wireshark
    使用docker部署springBoot并且yml配置文件不打包到jar中
    idea + springBoot项目配置远程调试
    MySql优化建议
    springBoot事务失效导致批量插入性能巨幅降低
  • 原文地址:https://www.cnblogs.com/zhangruifeng/p/13257731.html
Copyright © 2011-2022 走看看