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

    开发模式

    1. 前后端不分离

    2. 前后端分离

      • 前后端数据交互用的都是ajax请求;
        • 前端向后端发送ajax请求;
        • 后端返回前端json(也就是说用不上render或redirect,只用HttpResponse就可以了),向前端提供URL;
        • 也就是说前端永远发送ajax请求;而后端永远返回HttpResponse;

    为什么采用前后端分离?

    • 针对不同平台(如手机端,PC端,安卓,ios等)只需修改前端代码即可,无需修改后端代码;

    restful规范

      1. 以前的做法
      • 如果数据库中有10张表,分别做他们的增删改查的话,需要40个url,40个视图函数;
      • 过于繁琐,需要简化,此时出现了一些人写了一些规范,可以简化这个过程,一种事物的增删改查只写一个路由即可;

    1. restful规范

    • 对于一条数据只写一个路由,根据method的不同做不同的操作;

      # 基于FBV
      urlpatterns = [
      url(r'^order/', views.order),
      ]
      
      def order(request):
      if request.method == 'GET':
        return HttpResponse('获取订单')
      elif request.method == 'POST':
        return HttpResponse('创建订单')
      elif request.method == 'PUT':
        return HttpResponse('修改订单')
      elif request.method == 'DELETE':
        return HttpResponse('删除订单')
      
      
      # 基于CBV
      urlpatterns = [
      url(r'^order/', views.OrderView.as_view()),
      ]
      
      class OrderView(View):
      def get(self, request, *args, **kwargs):
        return HttpResponse('获取订单')
      def post(self, request, *args, **kwargs):
        return HttpResponse('创建订单')
      def put(self, request, *args, **kwargs):
        return HttpResponse('修改订单')
      def delete(self, request, *args, **kwargs):
        return HttpResponse('删除订单')
      

    1.1 推荐使用HTTPs协议

    API与用户的通信协议,推荐使用HTTPs协议

    1.2 域名:

    • 子域名方式(需要解决跨域问题)
      • www.xxx.com
      • api.xxx.com
    • URL方式
      • www.xxx.com
      • www.xxx.com/api/

    1.3 版本

    1.4 路径

    面向资源编程(面向切面编程):视网络上的任何东西都是资源,均使用名词表示(可用复数,不适用动词);

    1.5 method

    • GET:从服务器取出资源(一项或多项);
    • POST:在服务器创建资源;
    • PUT:在服务器更新资源(整体更新);
    • PATCH:在服务器更新资源(局部更新);
    • DELETE:从服务器删除资源;

    1.6 过滤

    通过在url上传参的形式传递搜索条件;

    1.7 状态码

    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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
    
    301和302:重定向(临时重定向和永久重定向)
    
    常用状态码:
    200系列:成功的;
    300系列:重定向的;
    400系列:客户端错误;
    500系列:内部代码错误;
    
    更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    

    状态码是远远不够的,现在都是状态码 + code结合使用,下面举一个简单的例子;

    class OrderView(View):
        def get(self, request, *args, **Kwargs):
            ret = {
                'code': 1000,
                'msg': 'xxx'
            }
            return HttpResponse(json.dumps(ret), status=201)
    

    1.8 错误处理

    状态码是4xx时,应返回错误信息,error当做key;

    {
        error: "Invalid API key"
    }
    

    1.9 返回结果

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

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

    1.10 Hypermedia API

    RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

    {"link": {
      "rel":   "collection https://www.example.com/zoos",
      "href":  "https://api.example.com/zoos",
      "title": "List of zoos",
      "type":  "application/vnd.yourformat+json"
    }}
    
  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/richard_A/p/13811041.html
Copyright © 2011-2022 走看看