zoukankan      html  css  js  c++  java
  • restful规范

    一、restful的引入

    对数据进行增、删、改、查,在之前进行操作时可能可能是这样写的:

    ##路由匹配
    
    urlpatterns = [
        path('userlist/', views.user),
        path('useradd/', views.user),
        path('useredit/', views.user),
        path('userdelete/', views.user),
       
    ]

    对应的view函数中就需要对请求方法进行判断:

    def user(request):
        #处理GET请求
        if request.method == 'GET':
            return HttpResponse('GET')
    
        # 处理POST请求
        if request.method == 'POST':
            return HttpResponse('POST')
        
        ...

    这样最大的问题就是随着业务的增多接口(url)会越来越多,其次是使用FBV的形式,需要对请求方法进行判断,也是有些麻烦的,为了解决这一类的问题,就引出了restful规范。

    二、restful规范

    1、API与用户的通信协议,总是使用HTTPs协议。

    2、域名

    #应该尽量将API部署在专用域名之下
    https://api.example.com #存在跨域问题

    3、版本(Versioning)

    #应该将API的版本号放入URL。
    https://api.example.com/v1/

    4、路径(Endpoint)

    #视网络上任何东西都是资源,建议url
    (1)均使用名词表示;
    (2)使用复数形式;
    (3)
    首选小写字母;
    (4)结尾不应该包含斜杠“/”;
    (5)应该使用连字符”-“来提高URL的可读性,而不是使用下划线”_”;
     https://api.example.com/v1/users

    5、请求方法(method)

    GET(SELECT):#从服务器取出资源(一项或多项)。
    POST(CREATE):#在服务器新建一个资源。
    PUT(UPDATE):#在服务器更新资源(客户端提供改变后的完整资源)。
    PATCH(UPDATE):#在服务器更新资源(客户端提供改变的属性)。
    DELETE(DELETE):#从服务器删除资源。

    另外两个不常用的method:

    HEAD:#获取资源的元数据。
    OPTIONS:#获取信息,关于资源的哪些属性是客户端可以改变的。

    实例:

    GET /depts:#列出所有部门
    POST /depts:#新建一个部门
    GET /depts/ID:#获取某个指定部门的信息
    PUT /depts/ID:#更新某个指定部门的信息(提供该动物园的全部信息)
    PATCH /depts/ID:#更新某个指定部门的信息(提供该动物园的部分信息)
    DELETE /depts/ID:#删除某个部门
    GET /depts/ID/persons:#列出某个指定部门的所有人员
    DELETE /depts/ID/persons/ID:#删除某个指定部门的指定人员

    6、过滤信息(Filtering)

    #记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果
    ?limit=10#指定返回记录的数量
    ?offset=10#指定返回记录的开始位置。
    ?page=2&per_page=100#指定第几页,以及每页的记录数。
    ?sortby=name&order=asc:#指定返回结果按照哪个属性排序,以及排序顺序。
    ?animal_type_id=1:#指定筛选条件

    7、状态码(Status Codes)

    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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

    更多参见:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

    8、错误处理(Error handling)

    如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。

    {
        error: "Invalid API key"
    }

    9、返回结果

    针对不同操作,服务器向用户返回的结果应该符合以下规范。

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

    10、Hypermedia API

    #RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
    
    #比如,当用户向api.example.com的根目录发出请求,会得到这样一个文档。
    
    {"link": {
      "rel":   "collection https://www.example.com/zoos",
      "href":  "https://api.example.com/zoos",
      "title": "List of zoos",
      "type":  "application/vnd.yourformat+json"
    }}

    参考:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

  • 相关阅读:
    关于js计算非等宽字体宽度的方法
    [NodeJs系列]聊一聊BOM
    Vue.js路由管理器 Vue Router
    vue 实践技巧合集
    微任务、宏任务与Event-Loop
    事件循环(EventLoop)的学习总结
    Cookie、Session和LocalStorage
    MySQL 树形结构 根据指定节点 获取其所在全路径节点序列
    MySQL 树形结构 根据指定节点 获取其所有父节点序列
    MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators
  • 原文地址:https://www.cnblogs.com/shenjianping/p/11380138.html
Copyright © 2011-2022 走看看