REST API 规约

  1. 【参考】RESTfull架构定义:

         (1)每一个URI代表一种资源;
    
         (2)客户端和服务器之间,传递这种资源的某种表现层;
    
         (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
    
  2. 【推荐】URI 正确设计应不包含动词,因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应放在HTTP协议中。

        反例: GET /posts/show/1
    
        正例: POST /accounts/1/transfer/500/to/2    PUT /posts/1  { ....}
    
  3. 【推荐】URI 资源名词应是复数形式,针对增删改查使用正确的HTTP 动作

        正例:
    
            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:删除某个指定动物园的指定动物
    
  4. 【推荐】过滤信息,如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。

        正例:
    
              ?limit=10:指定返回记录的数量
    
              ?offset=10:指定返回记录的开始位置。
    
              ?page=2&per_page=100:指定第几页,以及每页的记录数。
    
              ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
    
              ?animal_type_id=1:指定筛选条件
    
  5. 【推荐】服务器应向用户返回的状态码和提示信息,2xx 代表成功; 3xx 重定向 ; 4xx 请求错误 ; 5xx 服务端错误

        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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
    
  6. 【推荐】服务器应采用无状态机制,认证授权应考虑使用JWT、OAUTH2

  7. 【推荐】服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

results matching ""

    No results matching ""