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

    首先看一个restful风格的url:

    传统的带有动词,restful风格只有名词

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件。

    这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。

    网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。

    RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

    但是,到底什么是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

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

    GET /authors/12?categories=2

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

    GET /articles/published

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

    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减少了传统请求的拆装箱操作,结构清晰,在接口定义中受到前后端开发者的青睐。

    转自:https://www.cnblogs.com/zhangruifeng/p/13257731.html

  • 相关阅读:
    4种xml解析器区别
    eclipse的快捷键(常用)
    eclipse修改项目访问前缀
    oracle创建用户
    导入安全证书到jdk
    laravel 命令行输出进度条
    sql 事务的四种隔离级别
    supervisor 通过图形界面管理
    supervisor "INFO spawnerr: unknown error making dispatchers for xxx" 错误
    linux expect 的使用
  • 原文地址:https://www.cnblogs.com/vickylinj/p/14508411.html
Copyright © 2011-2022 走看看