接口测试 — 4.Requests库GET、Post请求

news2024/9/24 17:15:39

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。

(不带参数的GET请求请看上一篇文章的练习)

1、Requests库待参数的GET请求

使用Get方法带参数请求时,是params=参数字典,而不是data=参数字典。data=参数字典是post方法的参数。

"""
1.学习目标
    必须掌握requests中带参数的get请求
2.语法
    requests.get(url,parmas=None)
    2.1 不带参数的get请求(看上一篇中的练习)
    2.2 带参数的get请求(如下)
3.操作步骤
    # 1.导入requests库
    # 2.明确请求地址
    # 3.明确请求参数
        data = {key:value}  字典格式
    # 4.发送请求获取返回数据
4.需求
    使用requests库发送一个带参数的get请求
"""
# 1.导入requests库
import json
import requests

# 2.明确请求地址
url = "http://127.0.0.1:8000/api/departments/"
# 3.明确请求参数
# 是一个字典类型数据
data = {"$dep_id_list": "10,11"}
# 4.发送请求
response = requests.get(url=url, params=data)
# print(response.json())

# 将python对象转换为json字符串(格式化放回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)


"""
结果:
{
  "count": 2,
  "next": null,
  "previous": null,
  "results": [
    {
      "dep_id": "10",
      "dep_name": "超神_10",
      "master_name": "陆兴雷_10",
      "slogan": "带头学习"
    },
    {
      "dep_id": "11",
      "dep_name": "超神_11",
      "master_name": "陆兴雷_11",
      "slogan": "带头学习"
    }
  ]
}

"""

如果你想学习接口测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386    

Postman接口测试使用教程和接口自动化测试项目实战你要的都有_哔哩哔哩_bilibiliPostman接口测试使用教程和接口自动化测试项目实战你要的都有共计32条视频,包括:1.精通Postman之课程大纲和效果展示、2.精通Postman之接口测试简介和分类、3.精通Postman之接口测试流程和用例设计等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV11K4y1J7sh/?spm_id_from=333.337.search-card.all.click

 

2、查看GET请求的内容

我们可以通过访问Httpbin来查看或者调试Requests库发送请求的内容。

还是以上面的例子为例:

# 1.导入requests库
import json
import requests

# 2.明确请求地址
# url = "http://127.0.0.1:8000/api/departments/"
url = "http://127.0.0.1:9999/get"
# 3.明确请求参数
# 是一个字典类型数据
data = {"$dep_id_list": "10,11"}
# 4.发送请求
response = requests.get(url=url, params=data)
# response = requests.get(url='http://httpbin.org/get?name=admin&age=20')  # 这种方式调用也可以
# print(response.json())

# 将python对象转换为json字符串(格式化放回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)


"""
接口返回结果:
{
  "args": {
    "$dep_id_list": "10,11"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "Host": "127.0.0.1:9999",
    "User-Agent": "python-requests/2.18.4"
  },
  "origin": "127.0.0.1",
  "url": "http://127.0.0.1:9999/get?%24dep_id_list=10%2C11"
}

我们可以看到args属性中有参数内容,
如果是不带参数的Get请求,args属性中是没有内容的,如下:

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "Host": "127.0.0.1:9999",
    "User-Agent": "python-requests/2.18.4"
  },
  "origin": "127.0.0.1",
  "url": "http://127.0.0.1:9999/get"
}
"""

3、带请求头、参数的get请求

例如上面例子中,请求头信息中"User-Agent": "python-requests/2.18.4",我们需要改变请求头中User-Agent属性的内容,看下面例子:

# 1.导入requests库
import json
import requests

# 2.明确请求地址
# url = "http://127.0.0.1:8000/api/departments/"
url = "http://127.0.0.1:9999/get"
# 3.明确请求参数
# 是一个字典类型数据
data = {"$dep_id_list": "10,11"}

# 明确请求头信息
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4209.400"}

# 4.发送请求
response = requests.get(url=url, params=data, headers=headers)
# print(response.json())

# 将python对象转换为json字符串(格式化放回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)

"""
接口返回结果:可以看到User-Agent属性变成了我们设置的内容了。
{
  "args": {
    "$dep_id_list": "10,11"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Connection": "keep-alive",
    "Host": "127.0.0.1:9999",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4209.400"
  },
  "origin": "127.0.0.1",
  "url": "http://127.0.0.1:9999/get?%24dep_id_list=10%2C11"
}

"""

除此之外Get请求还有很多请求参数,如timeout你可以设置请求时间,如果超过这个时间变自行结束请求,可以利用此判断请求代理的相应效率,避免在某些错误请求上浪费过多的时间。

4、Requests库POST请求

POST请求用于向服务器提交数据,比如增删改数据,提交一个表单新建一个用户、或修改一个用户等。

对于POST请求,我们可以通过浏览器开发者工具或者其他外部工具来进行抓包,得到请求的URL、请求头(request headers)以及请求的表单data信息,这三样恰恰是我们用Requests模拟POST请求时需要的。

关于请求头的配置和GET请求是一样的,都是定义headers属性即可。

而关于POST请求提交的参数,是和GET请求是不一样的。

post请求四种传送正文方式:

  • (1)请求正文是application/x-www-form-urlencoded

  • (2)请求正文是multipart/form-data

  • (3)请求正文是raw

  • (4)请求正文是binary

这四种提交数据的方式,是在请求头Content-Type属性中来定义。

1、application/x-www-form-urlencoded

Reqeusts支持以application/x-www-form-urlencoded数据格式发送POST请求(标准的POST请求数据格式,默认),只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

示例:

"""
1.学习目标
    必须掌握requests库发送post请求方法
2.HTTP协议中post请求参数类型
    requests.post(url, data=None, json=None, **kwargs)
    根据不同的请求参数类型分为如下几种:
        x-www-form-data-urlencoded
        raw_json格式
        form-data
        binary
3.json格式
    # 1.导入requests库
    # 2.明确请求地址
    # 3.明确请求参数
        data = {key:value}  字典格式
    # 4.发送请求
        requests.post(url=url,json=data)
4.需求
    通过访问http://httpbin.org/post接口,验证post参数类型

"""
# 1.导入requests库
import requests
import json

# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = {
    "dep_id": "T01",
    "dep_name": "Test学院",
    "master_name": "Test-Master",
    "slogan": "Here is Slogan"
}
# 4.发送请求
response = requests.post(url=url, data=data)

# 将python对象转换为json字符串(格式化返回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)

"""
返回结果:
{
  "args": {},
  "data": "",
  "files": {},
  ****************主要看这里
  "form": {
    "dep_id": "T01",
    "dep_name": "Test学院",
    "master_name": "Test-Master",
    "slogan": "Here is Slogan"
  },
  ***********************
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "88",
    *****************主要看这里
    "Content-Type": "application/x-www-form-urlencoded",
    *****************
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.18.4",
    "X-Amzn-Trace-Id": "Root=1-5ff401e3-1553596b7788e77e275c4772"
  },
  "json": null,
  "origin": "106.35.9.12",
  "url": "http://httpbin.org/post"
}
"""

说明:

  • 发送的请求中,form属性接收了参数。
  • 在请求头中,Content-Type属性为application/x-www-form-urlencoded
  • 使用application/x-www-form-urlencoded格式发送数据,requests.post(url=url, data=data)方法中一定要使用data变量来接收参数。
  • 换句话说数据格式是字典格式,使用data变量来接收,会默认发送application/x-www-form-urlencoded数据格式的POST请求。(也可以在请求头中明确一下Content-Type属性,但没必要。)

2、请求正文是raw

RAW的原意就是“未经加工”。换句话说RAW方式使用的是纯字符串的数据上传方式,所以在发送POST请求之前,可能需要手工的把一些JSON格式的数据转换成字符串的(加两单引号),在进行提交。

RAW数据格式的POST请求有两种:

  • 一种是xml格式文本(text/xml)
  • 一种是json格式文本(application/json)

下面我们一一说明:

(1)json格式文本(application/json)
# 1.导入requests库
import requests
import json

# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = {
    "data": [
        {
            "dep_id": "T01",
            "dep_name": "Test学院",
            "master_name": "Test-Master",
            "slogan": "Here is Slogan"
        }
    ]
}

# headers = {"Content-Type": "application/json"}

# 4.发送请求
response = requests.post(url=url, json=data)
print(response)  # <Response [200]>
print(response.text)


"""
返回结果:
{
  "args": {}, 
  "data": "{\"data\": [{\"dep_id\": \"T01\", \"dep_name\": \"Test\\u5b66\\u9662\", \"master_name\": \"Test-Master\", \"slogan\": \"Here is Slogan\"}]}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "119", 
    **************************主要看这里
    "Content-Type": "application/json", 
    **************************
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4", 
    "X-Amzn-Trace-Id": "Root=1-5ff40a9d-6a6f19d272ba4c1b40ff7bbb"
  }, 
    **************************主要看这里
  "json": {
    "data": [
      {
        "dep_id": "T01", 
        "dep_name": "Test\u5b66\u9662", 
        "master_name": "Test-Master", 
        "slogan": "Here is Slogan"
      }
    ]
  }, 
    **************************
  "origin": "106.35.9.12", 
  "url": "http://httpbin.org/post"
}
"""

说明:

  • 发送的请求中,json属性接收了参数。
  • 在请求头中,Content-Type属性为application/json
  • 使用application/json格式发送数据,requests.post(url=url, json=data)方法中一定要使用json变量来接收参数。
  • 换句话说数据格式是Json格式,使用json变量来接收,Requests会默认发送application/json数据格式的POST请求。(也可以在请求头中明确一下Content-Type属性,但没必要。)

注意:

这里我们可以发现Requests模拟post请求时,请求头格式为application/x-www-form-urlencoded与application/json的主要差别在于请求主体的构造格式(前者是键值对,后者是JSON串),前者直接用字典传入,后者用json.dumps()函数将字典转为JSON串即可。

也就是说在有需要的时候json模块下的dumps函数可以将dict转换为str。

(2)xml格式文本(text/xml)

# 1.导入requests库
import requests
import json

# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = '<sites>' \
            '<site>' \
                '<name>菜鸟教程</name>' \
                '<url>www.runoob.com</url>' \
            '</site>' \
            '<site>' \
                '<name>Google</name>' \
                '<url>www.google.com</url>' \
            '</site>' \
       '</sites>'

#  requests.post方法中适用json变量来接收数据,
# 默认是"Content-Type": "application/json", 
# 这里我们需要重新声明一下Content-Type属性。
headers = {'Content-type': 'text/xml'}

# 4.发送请求
# 如果数据用data变量来接收会报错。
response = requests.post(url=url, json=data, headers=headers)
print(response)  # <Response [200]>
# print(response.text)

# 将python对象转换为json字符串(格式化返回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)

"""
返回结果:
{
  "args": {},
  "data": "\"<sites><site><name>\\u83dc\\u9e1f\\u6559\\u7a0b</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>\"",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "149",
    **************************主要看这里
    "Content-Type": "text/xml",
    **************************
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.18.4",
    "X-Amzn-Trace-Id": "Root=1-5ff40fa5-21a79b532b1ccf6d20173fd7"
  },
  **************************主要看这里
  "json": "<sites><site><name>菜鸟教程</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>",
    **************************
  "origin": "106.35.9.12",
  "url": "http://httpbin.org/post"
}
"""

说明:

  • text/xml格式相对用的少。
  • xml也可以作为一个文件来传输。
  • 需要重新声明请求头中Content-Type属性。
  • 其他和application/json一样。

提示:其实raw格式数据可以上传text、json、xml、html等纯字符的文本。

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"
}
"""

5、总结Binary和Form-data区别

主要区别在于:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Pytorch】Transposed Convolution

文章目录 1 卷积2 反/逆卷积3 MaxUnpool / ConvTranspose4 encoder-decoder5 可视化 学习参考来自&#xff1a; 详解逆卷积操作–Up-sampling with Transposed Convolution PyTorch使用记录 https://github.com/naokishibuya/deep-learning/blob/master/python/transposed_co…

DDD、SOA、微服务和微内核

DDD、SOA、微服务和微内核&#xff0c;看到经常有人把这几个概念拿出来一起讲。事实上&#xff0c;DDD和其他三个不是一个维度的东西。 DDD其实特别好理解&#xff0c;DDD就是领域来驱动设计嘛&#xff0c;是一种设计思想。很容易又和OOA、OOD和OOP来比较了。这个回头再说。 SO…

世微 AP9166 DC-DC降压IC 18V 2A同步降压转换器

600KHz&#xff0c;18V&#xff0c;2A同步降压转换器 概述 AP9166是一款完全集成的效率2A同步整流降压转换器。AP9166运行在宽输出电流上以高效率 负载范围。此设备提供两个操作模式、PWM控制和PFM模式切换控制&#xff0c;允许更宽范围的高效率 负载AP9166至少需要现成标准的…

JVM的内存分区以及垃圾收集

1.JVM的内存分区 1.1方法区 方法区(永久代&#xff09;主要用来存储已在虚拟机加载的类的信息、常量、静态变量以及即时编译器编译后的代码信息。该区域是被线程共享的。 1.2虚拟机栈 虚拟机栈也就是我们平时说的栈内存&#xff0c;它是为java方法服务的。每个方法在执行的…

mysql踩坑

关于安装 1报错&#xff1a;ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client具体代码如下&#xff1a; import mysql from "mysql"//连接数据库 const dbmysql.createPool({h…

计算机视觉技术在智慧城市建设中的应用

计算机视觉技术在智慧城市建设中的应用 随着城市化进程的不断推进&#xff0c;更多的人们选择在城市生活、工作和娱乐。面对快速增长的人口和日益复杂的城市环境&#xff0c;很多城市开始探索智慧城市的建设。智慧城市的核心就是将现代信息技术应用于城市管理中&#xff0c;以…

gitlab下载,离线安装

目录 1.下载 2.安装 3.配置 4.启动 5.登录 参考&#xff1a; 1.下载 根据服务器操作系统版本&#xff0c;下载对应的RPM包。 gitlab官网&#xff1a; The DevSecOps Platform | GitLab rpm包官网下载地址: gitlab/gitlab-ce - Results in gitlab/gitlab-ce 国内镜像地…

阿里云人工智能平台PAI多篇论文入选EMNLP 2023

近期&#xff0c;阿里云人工智能平台PAI主导的多篇论文在EMNLP2023上入选。EMNLP是人工智能自然语言处理领域的顶级国际会议&#xff0c;聚焦于自然语言处理技术在各个应用场景的学术研究&#xff0c;尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、…

vue中element-ui日期选择组件el-date-picker 清空所选时间,会将model绑定的值设置为null 问题 及 限制起止日期范围

一、问题 在Vue中使用Element UI的日期选择组件 <el-date-picker>&#xff0c;当你清空所选时间时&#xff0c;组件会将绑定的 v-model 值设置为 null。这是日期选择器的预设行为&#xff0c;它将清空所选日期后将其视为 null。但有时后端不允许日期传空。 因此&#xff…

Java 线程运行方法和原理

线程运行 原理 栈与栈帧&#xff1a; Java 虚拟机栈会为每个启动的线程分配一块栈内存&#xff0c;其中存储着栈帧&#xff08;Frame&#xff09; 每个栈由多个栈帧组成&#xff0c;栈帧对应调用方法&#xff08;函数&#xff09;所占用的内存每个栈只有一个活动栈&#xf…

羊大师解读,血压波动

羊大师解读&#xff0c;血压波动 血压是身体健康的一个重要指标&#xff0c;但有时候我们会发现血压存在着波动的情况。血压波动的原因有很多&#xff0c;包括生活方式、遗传因素、药物影响等等。本文小编羊大师将为大家详细介绍血压波动的原因&#xff0c;以及预防和管理血压…

无脑利用API实现文心一言AI对话功能?(附代码)

前言&#xff1a;在当今数字化的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在不断演进&#xff0c;为开发者提供了丰富的工具和资源。其中&#xff0c;API&#xff08;应用程序接口&#xff09;成为构建强大AI应用的关键组成部分之一。本文将介绍如何利用API来…

git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

GIT | 分支 文章目录 GIT | 分支创建分支合并分支删除分支合并冲突分支管理策略bug分支强制删除分支 创建分支 查看当前本地仓库中有哪些分支 git branchHEAD所指向的分支就是当前正在工作的分支 cat .git/HEAD创建一个分支 git branch dev创建好了&#xff0c;但是目前还是…

计算机组成原理—中央处理器CPU

文章目录 CPU的功能与架构CPU的组成运算器控制器 指令执行过程指令流程指令执行方案 数据通路单总线结构专用通路结构 硬布线控制器设计硬布线执行流程硬布线CU内部怎么设计微操作的组合电路 总结 微程序控制器设计微程序的基本理念微程序的基本结构 微指令设计微程序CU设计 指…

使用代理IP时的并发请求是什么意思?

很多做过数据采集的技术们应该都有所了解&#xff0c;在选择代理IP时会有一个并发请求的参数&#xff0c;这个参数是什么意思呢&#xff1f;可能有很多新手不是很了解&#xff0c;其实代理IP的并发请求就是指同时发送多个请求到目标服务器&#xff0c;以提高请求的效率和速度。…

嵌入式系统挑战赛题目---递归方法实现字符串反转函数

一、题目要求 递归函数是一种在函数内容调用自身的函数。它通过将复杂的问题分解成更小的子问题来解决。递归函数通常包含两部分&#xff1a;基本情况和递归调用。请使用递归方法实现字符串反转的C语言函数。 请根据要求在begin、end间完成代码&#xff0c;不要改变代码中其他…

开具实习证明:在线实习项目介绍

大数据在线实习项目&#xff0c;是在线上为学生提供实习经验的项目。我们希望能够帮助想要在毕业后从事数据科学类工作的学生更加顺利地适应从教室到职场的转换&#xff1b;也帮助那些在工作中需要处理数据、实现数据价值的其他职能的从业者高效快速地掌握每天都能用起来的数据…

3、Kafka 线上集群部署方案怎么做?

文章目录 1、操作系统的选择1.1、I/O 模型的使用1.2、数据网络传输效率1.3、社区支持度 2、磁盘的选择3、磁盘容量的规划3.1、举例思考本问题&#xff1a;3.2、计算一下&#xff1a;3.3、规划磁盘容量时你需要考虑下面这几个元素&#xff1a; 4、带宽规划4.1、计算 总结 1、操作…

CSS基础面试题

介绍一下标准css盒子模型与低版本IE的盒子模型&#xff1f; 标准盒子模型&#xff1a;宽度内容的宽度&#xff08;content&#xff09; border padding margin 低版本IE盒子模型&#xff1a;宽度内容宽度&#xff08;contentborderpadding&#xff09; margin box-sizing 属性…

Java架构师-数据机构与算法实战(第一篇)

数学知识回顾 指数 指数函数是重要的基本初等函数之一。一般地&#xff0c;ya^x函数(a为常数且以a>0&#xff0c;a≠1)叫做指数函数&#xff0c;函数的定义域是 R 。注意&#xff0c;在指数函数的定义表达式中&#xff0c;在a^x前的系数必须是数1&#xff0c;自变量x必须在…