59、Web应用模式、API接口、接口测试工具

113 阅读4分钟

Web应用模式

在开发Web应用中,有两种应用模式:前后端混合开发、前后端分离

前后端混合开发

后端人员:既要写后端,django,又要写前端

image-前后端不分离.png

前后端分离

后端人员:只写后端,写一个个的API接口;前端人员,只写前端;最后项目写完,前后端连调

image-前后端分离.png

API接口

1.背景:为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。
2.API接口:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
		1.前端:向后端发送请求,获取数据  eg:127.0.0.1:8080/index  --->返回数据
    2.后端:请求某个地址,返回固定的数据
    
3.Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点
  1.url链接--->127.0.0.1:8080/index
  2.有不同的请求方式:get、post、put、patch、delete
  3.请求参数--->127.0.0.1:8080/books?name=nana   放在请求体中
  4.响应结果:json或xml格式的key-value类型数据
		1.上方请求参数的output参数值决定了响应数据的格式
		2.举例:
    	1.xml格式:
        https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=xml
      2.json格式
        https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json

接口测试工具:Postman

Postman是一款接口调试工具,是一款免费的可视化软件,同时支持各种操作系统平台,是测试接口的首选工具。Postman可以直接从官网:https://www.getpostman.com/downloads/下载获得,然后进行傻瓜式安装。

1.写好的接口,要测试,可以使用浏览器来做,但是浏览器只能发送get请求,接口有其他请求方式,就需要借助接口测试工具
2.专门的接口测试工具
	1.postman:大部分公司用的,原来免费,后来收费
  2.postwomen:免费的
  3.apifox

使用

image-postman.png

post请求的编码格式

1.post请求的编码格式
	1.urlencoded  --->默认的格式   b'k1=v1&k2=v2'
  2.form-data --->传文件的格式,也可以传普通数据  b'----------------------------948273860232348624609515--\r\n'
  3.json格式 --->只能传数据  b'{"k1":"v1","k2":"v2"}'

urlencode

def index(request):
    # urlencoded  --->b'hobby=read&gender=female'
    
    # get请求  http://127.0.0.1:8000/index/?hobby=read&gender=female
    print(request.POST)  # <QueryDict: {}>
    print(request.GET)   # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
    print(request.body)  # b'hobby=read&gender=female'

    # post请求
    print(request.POST)  # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
    print(request.GET)  # <QueryDict: {}>
    print(request.body)  # b'hobby=read&gender=female'

    return JsonResponse({'name':'nana','age':18})

form-data

def form_data(request):
    # form_data   # b'----------------------------948273860232348624609515--\r\n'
    print(request.POST)  # <QueryDict: {'gender': ['male'], 'hobby': ['play']}>
    print(request.GET)   # <QueryDict: {}>
    print(request.FILES)  # <MultiValueDict: {'file': [<InMemoryUploadedFile: 77.PNG (image/png)>]}>
    
		print(request.body)  # b'----------------------------948273860232348624609515--\r\n'
    return JsonResponse({'name':'cx','age':18})

json格式

def json1(request):
    # json  http://127.0.0.1:8000/json1/
    print(request.POST)  # <QueryDict: {}>
    print(request.GET)  # <QueryDict: {}>
    print(request.body)  # b'{"hobby":"listen","gender":"male"}'
    import json
    data_dic = json.loads(request.body)
    print(data_dic)  # {'hobby': 'listen', 'gender': 'male'}
    hobby = data_dic.get('hobby')
    print(hobby)  # listen
    gender  = data_dic.get('gender')
    print(gender)  # male
    return JsonResponse({'name': 'xiao', 'age': 18})

作业

写三个接口

-接收urlencoded格式的请求,post接口,把接收到的数据,后端打印
-接口form-data,把文件保存到本地,数据打印出来
-接收json形式,把数据打印出来
	-json.loads(request.body)
import os

from django.shortcuts import render
from django.http import JsonResponse
from django.conf import settings

# Create your views here.


def index(request):
    # urlencoded  --->b'hobby=read&gender=female'
    # get请求  http://127.0.0.1:8000/index/?hobby=read&gender=female
    print(request.POST)  # <QueryDict: {}>
    print(request.GET)   # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
    print(request.body)  # b'hobby=read&gender=female'

    # post请求
    print(request.POST)  # <QueryDict: {'hobby': ['read'], 'gender': ['female']}>
    print(request.GET)  # <QueryDict: {}>
    print(request.body)  # b'hobby=read&gender=female'

    return JsonResponse({'name':'nana','age':18})


def form_data(request):
    # form_data   # http://127.0.0.1:8000/form_data/
    print(request.POST)  # <QueryDict: {'gender': ['male'], 'hobby': ['play']}>
    # print(request.GET)   # <QueryDict: {}>
    print(request.FILES)  # <MultiValueDict: {'file': [<InMemoryUploadedFile: 77.PNG (image/png)>]}>
    my_file = request.FILES.get('file')
    print(my_file,type(my_file))  # 2.2.png  <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
    if my_file:
        import os
        img_file = os.path.join(settings.BASE_DIR,'static','img',my_file.name)
        print(type(img_file))
        with open(img_file,'wb')as f:
            for chunk in my_file.chunks():
                f.write(chunk)
    else:
        print('还没有文件上传')

    """
    处理上传的文件
  从request.FILES中获得的真实的文件。这个字典的每个输入都是一个UploadedFile对象——一个上传之后的文件的简单的包装。

    你通常会使用下面的几个方法来访问被上传的内容:
    UploadedFile.read():从文件中读取整个上传的数据。小心整个方法:如果这个文件很大,你把它读到内存中会弄慢你的系统。你可以想要使用chunks()来代替,看下面;
    UploadedFile.chunks():如果上传的文件足够大需要分块就返回真。默认的这个值是2.5M,当然这个值是可以调节的。
    """
    # print(request.body)  # b'----------------------------948273860232348624609515--\r\n'
    return JsonResponse({'name':'cx','age':18})


def json1(request):
    # json  http://127.0.0.1:8000/json1/
    print(request.POST)  # <QueryDict: {}>
    print(request.GET)  # <QueryDict: {}>
    print(request.body)  # b'{"hobby":"listen","gender":"male"}'
    import json
    data_dic = json.loads(request.body)
    print(data_dic)  # {'hobby': 'listen', 'gender': 'male'}
    hobby = data_dic.get('hobby')
    print(hobby)  # listen
    gender  = data_dic.get('gender')
    print(gender)  # male
    return JsonResponse({'name': 'xiao', 'age': 18})

Django的文件上传与下载:cloud.tencent.com/developer/a…