zoukankan      html  css  js  c++  java
  • Restful API 接口与规范

    什么是restful?

    REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”

    REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来过去资源的表征,获得这些表征致使这些应用转变状态

    所有的数据,不管是通过网络获取的还是操作数据库获得(增删改查) 的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性

    对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

    对于互联网上的任意东西都视为资源,他认为一个url就是一个资源,比如:http://www.xxx.com/get_user/

    什么是API?

    API就是接口,提供的url。

    接口的用途:

      1.为别人提供服务

      2.前后端分离,练习前台页面与后台数据库的媒介

    接口的组成:

      url:url链接

      请求参数: 前台按照指定的key提供数据给后台

      响应数据: 后台与数据库交互后将数据反馈给前台

    RESTful API 规范

    接口规范:就是为了采用不同的后台语言,也能使用同样的接口获取到同样的前台数据

    如何写接口:接口规范是 规范化书写接口的,写接口要写url,响应数据

      注:如果将请求参数也纳入考量范围,那就是再写 接口文档

    两大部分

    url

    1)用api关键字标识接口url
        api.baidu.com   |   www.baidu.com/api
    
    2)接口数据安全性决定优先选择https协议
    
    3)如果一个接口有多版本存在,需要再url中标识体现
        api.baidu.com/v1/...    |   api.baidu.com/v2/...
    
    4)接口操作的数据源称之为资源,在url中 一般采用资源复数形式,一个接口可以概括对该资源的多种操作方式
       api.baidu.com/books     |   api.baidu.com/books/(pk)
    
    5)请求方式有多种,用一个url处理如何保证不混乱  -通过请求方式标识操作资源的方式
        /books        get            获取所有
        /books        post                增加一个(多个)
        /books/(pk)    delete        删除一个
        /books/(pk)    put            整体更新一个
        /books/(pk)    patch        局部更新一个
    
    
    6)资源往往涉及到数据的各种操作方式-筛选,排序,限制
        api.baidu.com/books/?search=西&ordering=-price&limit=3

    响应数据

    1) http请求的响应会有响应状态码,接口用来返回操作的资源数据,可以拥有 操作数据结果的 状态码
        status  0(操作资源成功)  1(操作资源失败)  2(操作资源成功,但没匹配结果)
        注:资源状态码不像http状态码,一般都是后台与前台或是客户约定的
        
    2) 资源的状态码文字提示
        status  ok    '账号有误'  '密码有误'  '用户锁定'
        
    3) 资源本身
        results
        注:删除资源成功不做任何数据返回(返回空字符串)
        
    4) 不能直接放回的资源(子资源、图片、视频等资源),返回该资源的url链接

     

    基于restful规范的原生Django接口

    主路由:url.py

    from django.conf.urls import url, include
    from django.contrib import admin
    
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 路由分发
        url(r'^api/', include('api.urls'))
    ]

    api组件的子路由:api/url.py

    from django.conf.urls import url
    
    from . import views
    urlpatterns = [
        url(r'^books/', views.Book.as_view()),
        url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),
    ]

    模型层:model.py

    from django.db import models
    
    class Book(models.Model):
        title = models.CharField(max_length=64)
        price = models.DecimalField(max_digits=5, decimal_places=2)
    
        class Meta:
            db_table = 'old_boy_book'
            verbose_name = '书籍'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return '《%s》' % self.title

    后台层: admin.py

    from django.contrib import admin
    
    from . import models
    
    admin.site.register(models.Book)

    视图层:views.py

    from django.http import JsonResponse
    
    from django.views import View
    from . import models
    
    
    # 六大基础接口:获取一个 获取所有 增加一个 删除一个 整体更新一个 局部更新一个
    # 十大接口:群增 群删 整体改群改 局部改群改
    class Book(View):
        def get(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            if not pk:  # 群查
                # 操作数据库
                book_obj_list = models.Book.objects.all()
                # 序列化过程
                book_list = []
                for obj in book_obj_list:
                    dic = {}
                    dic['title'] = obj.title
                    dic['price'] = obj.price
                    book_list.append(dic)
                # 响应数据
                return JsonResponse({
                    'status': 0,
                    'msg': 'ok',
                    'results': book_list
                }, json_dumps_params={'ensure_ascii': False})
            else:  # 单查
                book_dic = models.Book.objects.filter(pk=pk).values('title', 'price').first()
                if book_dic:
                    return JsonResponse({
                        'status': 0,
                        'msg': 'ok',
                        'results': book_dic
                    }, json_dumps_params={'ensure_ascii': False})
                return JsonResponse({
                    'status': 2,
                    'msg': '无结果',
                }, json_dumps_params={'ensure_ascii': False})
    
    
        # postman可以完成不同方式的请求:get | post | put ...
        # postman发送数据包有三种方式:form-data | urlencoding | json
        # 原生django对urlencoding方式数据兼容最好
        def post(self, request, *args, **kwargs):
            # 前台通过urlencoding方式提交数据
            try:
                book_obj = models.Book.objects.create(**request.POST.dict())
                if book_obj:
                    return JsonResponse({
                        'status': 0,
                        'msg': 'ok',
                        'results': {'title': book_obj.title, 'price': book_obj.price}
                    }, json_dumps_params={'ensure_ascii': False})
            except:
                return JsonResponse({
                    'status': 1,
                    'msg': '参数有误',
                }, json_dumps_params={'ensure_ascii': False})
    
            return JsonResponse({
                'status': 2,
                'msg': '新增失败',
            }, json_dumps_params={'ensure_ascii': False})
    视图层views.py

    Postman接口工具

    官网下载安装

    get请求,携带参数采用 Params

    post等请求,提交数据包可以采用三种方式:form-data,urlencoding,json

    所有请求都可以携带请求头

     

    万般皆下品,唯有读书高!
  • 相关阅读:
    pipelinewise 学习二 创建一个简单的pipeline
    pipelinewise 学习一 docker方式安装
    Supercharging your ETL with Airflow and Singer
    ubuntu中使用 alien安装rpm包
    PipelineWise illustrates the power of Singer
    pipelinewise 基于singer 指南的的数据pipeline 工具
    关于singer elt 的几篇很不错的文章
    npkill 一个方便的npm 包清理工具
    kuma docker-compose 环境试用
    kuma 学习四 策略
  • 原文地址:https://www.cnblogs.com/s686zhou/p/11679780.html
Copyright © 2011-2022 走看看