美文网首页接口文档及接口测试学习
『居善地』接口测试 — 9.Requests库POST请求(二)

『居善地』接口测试 — 9.Requests库POST请求(二)

作者: 繁华似锦Fighting | 来源:发表于2021-01-07 19:03 被阅读0次

    3、正文是binary

    使用binary格式的正文发送POST请求,是直接使用二进制流进行数据传输,多用于上传单个图片或图片。

    也可以用于把请求的参数放入一个文件中,进行数据的提交。

    示例如下:

    """
    1.学习目标
        掌握requests发送post请求
    2.HTTP协议中post请求参数类型
        x-www-form-data-urlencoded
        raw_json格式
        form-data
        binary
    3.binary格式
        # 1.明确请求地址
        # 2.明确请求参数
            data = {"files":open("文件名","rb")}  字典格式
        # 3.发送请求
            requests.post(url= url,files=data)
    4.需求
        http://httpbin.org/post
    """
    # 1.导入requests
    import requests
    
    # 2.请求地址
    url = "http://httpbin.org/post"
    
    # 3.请求参数
    # 读取文件中的数据作为参数进行提交。
    # key位置要写files,是规范
    # 也可以写其他的名字,不规范
    data = {"files": open("test.txt", "rb")}
    
    # 4.发送请求
    response = requests.post(url=url, files=data)
    print(response.text)
    
    
    """
    请求结果如下:
    {
      "args": {}, 
      "data": "", 
      **************************主要看这里
      "files": {
        "files": "username=\u5927\u5c0f\u59d0\r\npassword=test123456\r\nage=18"
      }, 
      **************************
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Content-Length": "192", 
        **************************主要看这里
        "Content-Type": "multipart/form-data; boundary=351e0b73ea144694a9e9fdd1e10d2486", 
        **************************
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4", 
        "X-Amzn-Trace-Id": "Root=1-5ff499ea-7ad42c4e6f056b44347b3c26"
      }, 
      "json": null, 
      "origin": "106.35.9.12", 
      "url": "http://httpbin.org/post"
    }
    """
    

    说明:

    • 发送的请求中,files属性接收了参数。
    • 在请求头中,Content-Type属性为multipart/form-data
    • 使用application/json格式发送数据,requests.post(url=url, files=data)方法中一定要使用files变量来接收参数。
    • 换句话说Requests也支持发送binary数据形式的POST请求,只需将文件传给requests.post()方法的files参数即可。

    4、multipart/form-data

    multipart/form-data数据格式的POST请求,多用于文件上传。

    示例1:

    """
    1.学习目标
        掌握requests发送post请求
    2.HTTP协议中post请求参数类型
        x-www-form-data-urlencoded
        raw_json格式
        form-data
        binary
    3.form-data格式
        使用files变量来接收数据,默认是使用form-data格式发送POST请求。
    4.需求
        http://httpbin.org/post
    """
    
    import requests
    
    files = {'file1': open('logo.png', 'rb')}
    response = requests.post('http://127.0.0.1:9999/post', files=files)
    print(response.text)
    
    
    """
    接口返回结果:
    {
      "args": {}, 
      "data": "", 
      **************************主要看这里
      "files": {
        "file1": "data:application/octet-stream;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHerOCtwJPHpvQjoYqxmHighE/wO1YuuATgOKt9wGMd653WXlhe2xbcpauJjePjQYuZTOOk032eaYj+GgOQ+E1QCBj4UxtunNUFIjBmm5P05oBjLv99qoKgEpW9PSu1b0tAglXYOr2/uN4rtp6ZZay53n81IAlauN/pRH/2Q=="
      }, 
      **************************
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "keep-alive", 
        "Content-Length": "394145", 
        **************************主要看这里
        "Content-Type": "multipart/form-data; boundary=4efea05a2cf34e78a75508a1ebf000ec", 
        **************************
        "Host": "127.0.0.1:9999", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "127.0.0.1", 
      "url": "http://127.0.0.1:9999/post"
    }
    """
    

    示例2:

    我们也可以显式地设置文件名,文件类型和请求头:

    import requests
    # hangge.png 为图片名称
    files = {'file1': ('hangge.png', open('logo.png', 'rb'), 'image/png', {'Expires': '0'})}
    response = requests.post('http://127.0.0.1:9999/post', files=files)
    print(response.text)
    
    
    """
    接口返回结果:
    {
      "args": {}, 
      "data": "", 
      **************************主要看这里
      "files": {
        "file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyacMkc0Yyc0UAf/Z"
      }, 
      **************************
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "keep-alive", 
        "Content-Length": "7063", 
        **************************主要看这里
        "Content-Type": "multipart/form-data; boundary=382e06cba6834118a1f1efd0ea2c45e3", 
        **************************
        "Host": "127.0.0.1:9999", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "127.0.0.1", 
      "url": "http://127.0.0.1:9999/post"
    }
    
    """
    

    示例3:多文件上传

    有时我们需要在一个请求中同时发送多个文件,同样使用 files 参数传入一个数组即可:

    import requests
    files = [
            ('file1', ('1.png', open('logo.png', 'rb'), 'image/png')),
            ('file2', ('2.png', open('logo.png', 'rb'), 'image/png'))
    ]
    response = requests.post('http://127.0.0.1:9999/post', files=files)
    print(response.text)
    
    
    """
    接口返回结果:
    {
      "args": {}, 
      "data": "", 
      **************************主要看这里
      "files": {
        "file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc3p8zdacMkc0Yyc0UAf/Z", 
        "file2": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc3p8zdacMkc0Yyc0UAf/Z"
      }, 
      **************************
      "form": {}, 
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "keep-alive", 
        "Content-Length": "14054", 
        **************************主要看这里
        "Content-Type": "multipart/form-data; boundary=ba662835a2364b069c99ba3ffa56b974", 
        **************************
        "Host": "127.0.0.1:9999", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "127.0.0.1", 
      "url": "http://127.0.0.1:9999/post"
    }
    
    """
    

    示例4:上传时附带其它参数

    如果我们需要在上传文件的同时传递一些其它参数,也是可以的:

    import requests
    
    data = {
        "name": "ABC.com",
        "age": 100
    }
    files = [
        ('file1', ('1.png', open('logo.png', 'rb'), 'image/png')),
        ('file2', ('2.png', open('logo.png', 'rb'), 'image/png'))
    ]
    response = requests.post('http://127.0.0.1:9999/post', data=data, files=files)
    print(response.text)
    
    """
    接口返回结果:
    {
      "args": {}, 
      "data": "", 
      **************************主要看这里
      "files": {
        "file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDA0Yyc0UAf/Z", 
        "file2": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDA0Yyc0UAf/Z"
      }, 
      "form": {
        "age": "100", 
        "name": "ABC.com"
      }, 
      **************************
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Connection": "keep-alive", 
        "Content-Length": "14233", 
        **************************主要看这里
        "Content-Type": "multipart/form-data; boundary=6bdedbde2b48465683ef4e3451f7e015", 
        **************************
        "Host": "127.0.0.1:9999", 
        "User-Agent": "python-requests/2.18.4"
      }, 
      "json": null, 
      "origin": "127.0.0.1", 
      "url": "http://127.0.0.1:9999/post"
    }
    """
    

    示例5:流式上传文件

    • 有时我们需要上传一个非常大的文件(比如 1G 左右),如果像上面的方式直接使用 Requests 提交,可能会造成内存不足而崩溃。

    • 所以发送大文件时还是建议将请求做成数据流。不过默认下 Requests 不支持流式上传,但有个第三方包 requests-toolbelt 是支持的(本质还是 multipart/form-data 上传)

    • 在使用 requests-toolbelt 之前,我们首先通过 pip 进行安装:

      # cmd命令行终端执行如下命令。
      pip install requests-toolbelt
      

    练习如下:

    """
    1.学习目标
        掌握requests发送post请求
    2.HTTP协议中post请求参数类型
        x-www-form-data-urlencoded
        raw_json格式
        form-data
        binary
    3.form-data格式
        # 1.导入requests库,requests_toolbelt库
        # 2.明确请求地址
        # 3.明确请求参数
            data = {}  字典格式
            对请求参数加工(实例化)
            m = MultipartEncoder(fields = data)
        # 4.添加请求头
            headers = {"Content_Type":m.content_type}
        # 5.发送请求
            requests.post(url= url,data=m,headers=headers)
    4.需求
        http://httpbin.org/post
    """
    # 1.导入requests库
    import requests
    from requests_toolbelt import MultipartEncoder
    # from requests_toolbelt.multipart.encoder import MultipartEncoder
    
    # 2.明确请求地址
    url = "http://httpbin.org/post"
    # 3.明确请求参数
    data = {
        "username": "Jerry",
        "password": "1232456",
        "sex": "男"
    }
    
    # requests-toolbelt 还提供了个监视器(MultipartEncoderMonitor),
    # 该监视器接受一个回调函数,我们可以在回调中实时跟踪进度。
    # from requests_toolbelt import MultipartEncoderMonitor
    # def my_callback(monitor):
    #     progress = (monitor.bytes_read / monitor.len) * 100
    #     print("\r 文件上传进度:%d%%(%d/%d)"
    #           % (progress, monitor.bytes_read, monitor.len), end=" ")
    
    # m = MultipartEncoder(
    #     fields={'name': 'ABC.com', "age": '100',
    #             'file1': ('1.png', open('logo.png', 'rb'), 'image/png'),
    #             'file2': ('2.png', open('logo.png', 'rb'), 'image/png')}
    # )
    
    # 4.添加请求头和加工请求参数
    # 加工请求参数----让每个参数都要带有边界
    m = MultipartEncoder(fields=data)
    
    # 添加请求头
    headers = {"Content_Type": m.content_type}
    
    # 4.发送请求
    response = requests.post(url=url, data=m, headers=headers)
    print(response.text)
    
    """
    请求结果:
    
    {
      "args": {}, 
      "data": "", 
      "files": {}, 
      **************************主要看这里
      "form": {    
        "username": "Jerry",
        "password": "1232456",
        "sex": "男"
        }, 
      **************************
      "headers": {
        "Accept": "*/*", 
        "Accept-Encoding": "gzip, deflate", 
        "Content-Length": "192", 
        **************************主要看这里
        "Content-Type": "multipart/form-data; boundary=351e0b73ea144694a9e9fdd1e10d2486", 
        **************************
        "Host": "httpbin.org", 
        "User-Agent": "python-requests/2.18.4", 
        "X-Amzn-Trace-Id": "Root=1-5ff499ea-7ad42c4e6f056b44347b3c26"
      }, 
      "json": null, 
      "origin": "106.35.9.12", 
      "url": "http://httpbin.org/post"
    }
    """
    

    参考:https://www.hangge.com/blog/cache/detail_2375.html

    5、总结Binary和Form-data区别

    主要区别在于:

    • Binary只可以上传二进制数据,通常用来上传文件,由于没有键值,所以一次只能上传一个文件,而Form-data可以传多个。

    • Form-data既可以上传文件等二进制数据,也可以上传表单键值对。利用key-value对,可以分别对每个文件进行描述。

    相关文章

      网友评论

        本文标题:『居善地』接口测试 — 9.Requests库POST请求(二)

        本文链接:https://www.haomeiwen.com/subject/dscooktx.html