欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

requests之不同类型的传参

程序员文章站 2022-04-02 11:12:45
上一篇,我们介绍了几种种带参数的请求类型划分。这篇,通过github上的API,来一个个的参数接口的演示。1、不带参数的get请求# 导入requests包import requests # 1. 组装请求url = "https://api.github.com" # 这里只有url,字符串格式# 2. 发送请求,获取响应res = requests.get(url) # res即返回的响应对象# 3. 解析响应print(res.json) # 输出响应的文本res.json...

上一篇,我们介绍了几种种带参数的请求类型划分。这篇,通过github上的API,来一个个的参数接口的演示。
1、不带参数的get请求

# 导入requests包
import requests 

# 1. 组装请求
url = "https://api.github.com"  # 这里只有url,字符串格式
# 2. 发送请求,获取响应
res = requests.get(url) # res即返回的响应对象
# 3. 解析响应
print(res.json)  # 输出响应的文本

res.json()方法实际上是使用了json.loads(res.text)将响应文本尝试以JSON格式转为字典。由于该方法存在异常(比如正常情况下返回JSON格式,500报错时则会返回非JSON格式的报错信息),建议使用try…except处理,修改如下。

import requests
url = 'https://api.github.com'
url_params = {'name': '浩浩', 'age': '18'}
res = requests.get(url, params=url_params)
try:
    print('响应文本转为字典', res.json())
except:
    print('响应文本', res.text)

2、带参数的get请求

import requests 

url = "https://api.github.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好"  # 参数可以写到url里
res = requests.get(url=url) # 第一个url指get方法的参数,第二个url指上一行我们定义的接口地址
print(res.text)  

URL只支持ASCII(美国标准码),在实际的传输过程中,中文及一些特殊字符需要经过urlencode(URL编码)。如上例中的接口地址会被编码成:
https://api.github.com/get?name=%E4%B8%B4%E6%B8%8A&age=18

或者这样写`

import requests 

url = "https://api.github.com/openapi/api"
params = {"key":"ec961279f453459b9248f0aeb6600bbe","info":"你好"} # 字典格式,单独提出来,方便参数的添加修改等操作
res = requests.get(url=url, params=params) 
print(res.text)  

需要注意的是,requests.get()方法中,参数params后面跟着是一个字典,requests会自动帮我们把这个参数拼接在接口请求地址中
3、传统表单类POST请求(x-www-form-urlencoded)

import requests 

url = "https://api.github.com"
data = {"name": "浩浩", "age": 18} # Post请求发送的数据,字典格式
res = requests.post(url=url, data=data) # 这里使用post方法,参数和get方法一样
print(res.text)  

4、JSON类型的POST请求(application/json)

import requests 

url = "https://api.github.com"
data = '''{
        "name": "浩浩",
        "age": 18
        }''' # 多行文本, 字符串格式,也可以单行(注意外层有引号,为字符串) data = '{"name": "浩浩", "age": 18}'
res = requests.post(url=url, data=data) #  data支持字典或字符串
print(res.text)  

data参数支持字典格式也支持字符串格式,如果是字典格式,requests方法会将其按照默认表单urlencoded格式转换为字符串,如果是字符串则不转化
如果data以字符串格式传输需要遵循以下几点:

必须是严格的JSON格式字符串,里面必须用双引号,k-v之间必须有逗号,布尔值必须是小写的true/false等等
不能有中文,直接传字符串不会自动编码
一般来说,建议将data声明为字典格式(方便数据添加修改),然后再用json.dumps()方法把data转换为合法的JSON字符串格式

import requests 
import json # 使用到JSON中的方法,需要提前导入

url = "https://api.github.com"
data = {
        "name": "浩浩",
        "age": 18
        }  # 字典格式,方便添加
headers = {"Content-Type":"application/json"} # 严格来说,我们需要在请求头里声明我们发送的格式
res = requests.post(url=url, data=json.dumps(data), headers=headers) #  将字典格式的data变量转换为合法的JSON字符串传给post的data参数
print(res.text)  

或直接将字典格式的data数据赋给post方法的JSON参数(会自动将字典格式转为合法的JSON文本并添加headers)

import requests 

url = "https://api.github.com/openapi/api/v2"
data = {
	"reqType":0,
    "perception": {
        "inputText": {
            "text": "哈哈哈"
        },
        "inputImage": {
            "url": "imageUrl"
        },
        "selfInfo": {
            "location": {
                "city": "北京",
                "province": "北京",
                "street": "古城南街"
            }
        }
    },
    "userInfo": {
        "apiKey": "ec961279f453459b9248f0aeb6600bbe",
        "userId": "206379"
    }
} 
res = requests.post(url=url, json=data) # JSON格式的请求,将数据赋给json参数
print(res.text)  

5、发送XML格式的数据
上例提到XML和JSON都属于Raw格式的数据,XML和JSON在Python中实际都是不同格式的文本字符串。我们将字符串传递给请求方法的data参数即可原样发送,即data参数有以下3重作用:

1)data = {} 或 [(,), (,)]:接受一个字典或嵌套列表格式的数据,会按表单Url编码格式
2)data = ‘’:接受一个字符串或bytes二进制字符串,会原样发送(需要手动添加请求头,如果存在中文需要手动编码)
3)data = open(’…’, ‘rb’):接受一个文件对象,按binary格式流式上传。
发送XML格式的数据只要将XML格式的多行字符串传递给请求方法的data参数即可,示例如下。

import requests
url = 'https://api.github.com/post'
xml_data = '''
<xml>
    <name>浩浩</name>
    <age>18</name>
</xml>
'''
headers = {'Content-Type': 'application/xml'}

res = requests.post(url, data=xml_data.encode('utf-8'), headers=headers)
print(res.text)

由于xml_data数据中存在非ASCII码,需要将数据按utf-8格式编码为bytes二进制字符串发送。由于使用Raw格式发送数据时不会自动添加请求头,因此一般要手动在请求头中添加内容类型声明,并将构造的字典类型的请求头变量,传递给请求方法的关键字参数headers。
6、发送Multipart/form-data请求(文件上传)
网页上的表单有两种,一种是不包含文件上传,所有用户输入或选择的数据都可以使用字符串格式表示,这种称为普通表单或纯文本表单,对应MIME类型为application/x-www-form-urlencoded。

另一种即包括普通输入框等,也包含一个或多个文件上传框。普通输入框中的变量值可以已字符串格式编码,而上传的文件(如图片文件)则不一定能直接转为字符串,要使用二进制格式。因此要使用多部分的混合格式,笔者称之为混合表单,对应MIME类型为multipart/form-data。在表单中,每个需要上传的文件和普通输入框一样对应一个指定的变量。因此同样可以使用字典格式组装混合表单的请求数据传递给请求方法的files参数即可,示例如下。

import requests
url = 'https://api.github.com/post'
multi_form_data = {
    'name': '浩浩',
    'age': '18',  # 不能使用int类型
    'avatar': open('/Users/apple/Pictures/robot.png', 'rb'),
    'avatar2': open('/Users/apple/Pictures/robot.jpg', 'rb'),
}

res = requests.post(url, files=multi_form_data)
print(res.text)

表单数据中的数字要使用字符串格式的数字,文件要以rb二进制格式打开传输,支持多个变量以及多个文件。

文件类型的数据avatar可以只穿一个打开的文件对象open(’/Users/apple/Pictures/robot.png’, ‘rb’),也可以传递三个参数:要保存的文件名,打开的文件及文件MIME类型,即

‘avatar’: (‘robot.png’, open(’/Users/apple/Pictures/robot.png’, ‘rb’), ‘image/png’),

比如有些接口上传Excel文件时必须声明文件名和MIME类型,如:

res = request.post(url, files={'upload_file': 
        ('data.xlsx', 
        open('data.xlsx', 'rb'),
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    })

7、发送Binary格式数据(单文件/流式上传)

import requests
url = 'https://api.github.com/post'

res = requests.post(url, data=open('/Users/apple/Pictures/robot.jpg', 'rb'))
print(res.text)

这种很少见,了解一下就行。

有什么不明白的可以私我加vx:18547673653 或者qq:1270059901

本文地址:https://blog.csdn.net/weixin_45608577/article/details/109635754