API接口与测试工具的使用

API接口与测试工具的使用

前后端分离开发模式

1.前后端分离的开发模式
	我们之前学习的一般都是那种前后端混合开发的项目我们称之为全栈开发,但是这种开发的开发效率不是那么的高,所以衍生出了前后端分离的开发模式,现在市场上绝大多数的开发模式也是前后端分离的开发模式,前端的只搞前端,后端的只搞后端,提高开发效率

2.前端开发模板补充
	2.1 X-admin,前端后台管理模板:layui+jQuery开发的一套模板,由国人贤心开发,于2021年停止服务开发,但是内部模板仍可使用,永久免费。
	网址:http://x.xuebingsi.com/#
	2.2 AdminLTE,前端后台管理模板:bootstrap+jquery开发的一套模板,由外国人开发完成,但是属于收费模板
	网址:https://adminlte.io/

	2.3 layui:是一套开元的web UI解决方案,采用自身经典的模块化规范,并遵循原生HTML/CSS/JS的开发方式,常适合网页界面的快速开发。layui区别于那些基于MVVM底层的前端框架,它更多是面向后端开发者,无须涉足前端各种工具,只需要面对浏览器本身,让一切所需要的元素与交互,也是在2021年下线,日常维护工作被迁移到Github和Gitee.

3.前后端混合开发,使用模板语法渲染模板
	我们之前写的:BBS,图书管理等后端人员需要通过前端提前写好的html页面套用模板语法编写

4.前后端分离项目
	4.1 后端人员只负责写好接口(API接口),使用postman接口测试工具测试
	4.2 前端人员写好前端,写的过程使用mock数据,进行测试
	4.3 双方完成测试后,进行前后端联调测试项目,最终经过测试后进行上线

API接口(Application Program Interface)

1.什么是API接口
	应用程序接口是一组定义,程序及协议的集合,通过API接口实现计算机软件之间的互相通信。API的一个主要功能是提供通用功能集。程序员通过调用API函数对应用程序进行开发,可以减轻变成人物,API同事也是一种中间件,为各种平台提供数据共享。

2.接口的概念
	API就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作西永的API而操作系统去执行应用程序的命令,例如我们最经常使用的增删改查等.并且通过网络,规定了前后端信息交互规则的url连接,也就是前后端信息交互的媒介

3.接口样式
接口名称:登录
请求地址:http:testapi.eduoln.com/api/Account/DemoMethod
请求方式:poet、get、put、patch、delete等
返回值:json或xml格式的key-value类型数据
功能描述:该接口用于移动端登录使用
ak:6E823f587c95f0148c19993539b99295
region:上海
query:XXX
响应结果:json或xml格式的数据
返回结果样式:
    {"msg":True,
    "Message":"操作成功",
     "ResultCode":"10000",
     "Info":{
         "Account":"admin",
         "Phome":"520520",
         "RealName":"管理员",
         "Email":"dddd@qq.com"
     }
    }

测试工具(postman,postwomen等)

1.在我们的接口写好后,后端人员需要进行测试,但是不可能在浏览器里测试,使用postman软件,来做接口测试,其实就是模拟发送http请求,接口测试软件有很多,我们也可以使用postwomen来做接口测试,postman是收费的但是我们其中使用的功能并不是收费的,但是其他功能是收费的,所以有时候公司会使用其他测试工具。
2.我们直接去postman官网官网下载安装即可
网址:https://www.postman.com/downloads/

restful规范

  • REST全称是(Representational State Transfer),中文意思是表述:表征状态转移,他首次出现实在2000年Roy Fielding的博士论文中

  • REstful是一种定义web API接口的设计风格,尤其是适用于前后端分离的应用模式中

  • restful规范有十点,但是只是限制restful规范我们在公司中每个公司都有不同的使用习惯与风格

    • 1.数据的安全保障:url链接一般都采用https协议进行传输,为了保证数据的安全使用https协议进行传输,在HTTP的基础上通过传输加密和身份证保证了传输过程的安全性,HTTPS在HTTP的基础上增加了SSL,HTTPS安全的基础也是SSL,因此加密的详细内容就需要SSL。HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层,这个体统提供了身份验证与加密通讯方法,它被广泛用于万维网上安全敏感的通讯,例如交易支付等方面。

      • HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer):http+ssl+tsl
      • SSL/TLS:TLS/SSL的功能实现主要是依赖于三类基本算法:散列函数hash、对称加密算法和非对称加密,其利用非对称加密实现身份认证和密匙协商,对称加密算法采用协商的密匙对数据加密,基于散列函数验证信息的完整性。
    • 2.接口中需要带有api关键字

    • 3.多数据版本共存,一个接口可能有多个版本,所以我们的url链接中就应该有标识版本的功能

      • 例如我们之前应用的登录接口只需要验证用户名和密码正确就可以登录,后来我们发布的版本新增了验证码的功能,但是你不能保证所有人你这边一旦更新使用旧版本的人也会一起更新,一定会使用的版本有差异,那么我们就需要保留之前版本的接口以防低版本用户无法使用该功能。那么也就导致了我们的接口版本不一致问题。
    • 4.数据既是资源,均使用名词(可用复数),接口尽量使用名词,都使用名词,没法区分是增加,删除,修改,还是查询,接口一般都是完成前后端数据的交互,交互的数据我们称之为资源。

    • 5.资源操作由请求方式决定

      • 获取数据:get请求
      • 新增数据:post请求
      • 修改数据:put,patch请求
      • 删除数据:delete请求
      • 请求地址都一样,通过请求方式决定对资源进行什么操作
    • 6.url地址中带过滤参数,通过url传参的方式传递搜索条件

      • 我们可以指定返回记录的数量
      • 指定返回记录起始位置
      • 指定第几页以及每页的记录数
      • 指定返回结果按照哪个属性排序,以及排序顺序
      • 指定筛选条件等
    • 7.响应状态码

      • http状态码:http://tools.jd51.net/table/http_status_code
      • 1xx:表示请求正在处理,一般看不到
      • 2xx:表示请求处理成功,例如我们最熟悉的200
      • 3xx:表示重定向至哪哪哪 301,302等
      • 4xx:客户端错误
      • 5xx:服务端错误:这个更是在客户端上看不到,因为即使是5xx的错误也会被程序员故意渲染成4xx嘻嘻
      • 在响应体中写状态码:每个公司之间的规范可能不太一样,但是最多的就是{'code':100}这种
      • 详细的详情状态码可参考:https://www.cnblogs.com/joseph-bright/p/16614325.html#_label2
    • 8.返回错误信息,响应体中写状态码(也可以携带错误信息)

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

      • GET/collection:返回资源对象的列表(数组)
      • GET/collection/resource:返回单个资源对象
      • POST/collection:返回新生成的资源对象
      • PUT/collection/resource:返回完整的资源对象
      • PATCH/collection/resource:返回完整的资源对象
      • DELETE/collection/resource:返回一个空文档
    • 10.响应中携带链接,需要url请求的资源需要访问资源的请求链接

序列化与反序列化

  • API接口开发,最核心最常见的一个过程就是序列化,所谓序列化其实就是将数据转换格式,通过这种通用的中间格式我们就可以实现不同编程语言的数据互通

  • 序列化:把我们识别的数据转换成指定格式提供给别人,我们最常使用的格式就是转换成json格式数据

    • 例如,我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或其他平台,那么我们就需要将数据进行系列化处理,将字符串或者json数据提供给别人实现数据的互通
  • 反序列化:把别人提供的数据进行转换,转换成我们需要的格式并使用,被称为反序列化

    • 前端js提供过来的json数据对于python而言就是字符串或者字典,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。

djangorestframework快速使用

  • Django REST framework是一个建立在Django基础上的web应用开发框架,可以快速的开发REST API接口应用,在REST frameword中,提供了序列化器Seriazier的定义,可以帮助我们简化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类,视图集来简化视图的编写工作,REST frameword还提供了认证,权限,限流,过滤,分页,接口文档等功能支持。REST frameword提供了一个API的web可视化界面来方便查看测试接口。

  • 特点:

    • 提供了定义序列化器Serializer的方法,可以快速根据Django ORM或者其他库自动序列化和反序列化
    • 提供了丰富的类视图,Mixin扩展类,简化视图
    • 丰富的定制层级,函数视图,类视图,视图集合到自动生成的API,满足各种需要
    • 多种身份证和权限认证方式的支持
    • 内置了限流系统
    • 直观的API界面
    • 可扩展性,插件丰富

官方文档:https://www.django-rest-framework.org/

GitHub:https://github.com/encode/django-rest-framework/tree/master




* ### models.py

  ~~~python
  from django.db import models
  
  class Book(models.Model):
      name = models.CharField(max_length=32)
      price = models.CharField(max_length=32)
      publish = models.CharField(max_length=32)
  • urls.py

    from django.contrib import admin
    from django.urls import path
    from rest_framework.routers import SimpleRouter
    from app01 import views
    
    
    router = SimpleRouter()
    router.register('books',views.BookView)
    urlpatterns = [
        path('admin/', admin.site.urls),
    ]
    urlpatterns += router.urls
    
  • serializer.py

    from rest_framework import serializers
    from .models import Book
    
    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
            fields = '__all__'
    
  • views.py

    from .models import Book
    from rest_framework.viewsets import ModelViewSet
    from .serializer import BookSerializer
    
    class BookView(ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
    
  • 通过postman测试

CBV源码分析(查看类视图函数)

  • 第一个参数时路径,第二个参数时视图函数的内存地址(视图类执行as_view这个类方法,把它执行完,结果放在第二个参数上,我们寻找这个函数的内存地址)

路径参数

    path('test/',views.TestView.as_view())

as_view源代码(寻找内存地址)

    @classonlymethod
    def as_view(cls, **initkwargs):
        for key in initkwargs:
            if key in cls.http_method_names:
                raise TypeError(
                    "to %s()." % (key, cls.__name__)
                )
            if not hasattr(cls, key):
                raise TypeError( % (cls.__name__, key)
                )
			return View  # 我们在返回这里找到View所以需要进这里继续寻找内存地址
        当请求来的时候由路由匹配成功,会执行view函数并传入(request),本质执行self.dispatch(request,*args,**kwargs)

View源代码

        def view(request, *args, **kwargs):
            self = cls(**initkwargs)
            self.setup(request, *args, **kwargs)
            if not hasattr(self, "request"):
                raise AttributeError( % cls.__name__
                )
            return self.dispatch(request, *args, **kwargs)  # 返回了dispatch继续跟进寻找内存地址
        view.view_class = cls
        view.view_initkwargs = initkwargs

dispatcha源代码

    def dispatch(self, request, *args, **kwargs):
        # 请求方式转变成小写进入http_method_names中匹配,内部也是一堆小写的请求方式
        if request.method.lower() in self.http_method_names:
            # 利用反射魔法方法 getattr操控字符串(对象,'字符串','默认值')返回我们的get对象
            handler = getattr(
                self, request.method.lower(), self.http_method_not_allowed
            )
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)  # 最后在这边停下返回了handler
posted @ 2022-09-23 20:30  Joseph-bright  阅读(162)  评论(0编辑  收藏  举报