1、requests post json/data
在Python的requests
库中,当你发送POST请求时,可以选择使用json
参数或data
参数来传递数据。这两者之间的主要区别在于它们如何被序列化和发送到服务器。
json
参数:- 当你使用
json
参数时,requests
库会自动将Python字典序列化为JSON格式,并将Content-Type
头部设置为application/json
。 - 这意味着你不需要手动将数据转换为JSON字符串,也不需要设置请求头。
- 示例:
import requestsurl = 'http://example.com/api' payload = {'key1': 'value1','key2': 'value2' }response = requests.post(url, json=payload)
- 在这个例子中,
payload
是一个Python字典,通过json
参数传递给requests.post()
方法。requests
库会自动将其序列化为JSON并设置正确的请求头。
- 当你使用
例子:
import requestsurl = 'http://192.1***:7889/get_question'response = requests.post(url, json={"text": "水电工"})
response.json()
data
参数:- 当你使用
data
参数时,你可以直接传递一个字典、字符串、元组列表或字节流。 - 如果传递的是一个字典,
requests
库会将其视为表单数据,并将其编码为x-www-form-urlencoded
格式(对于普通的表单提交)。在这种情况下,Content-Type
头部通常会被设置为application/x-www-form-urlencoded
。 - 如果传递的是一个字符串、元组列表或字节流,你需要确保数据已经是适当的格式,并且可能需要手动设置
Content-Type
头部。 - 示例:
import requestsurl = 'http://example.com/api' payload = {'key1': 'value1','key2': 'value2' }response = requests.post(url, data=payload)
- 在这个例子中,
payload
是一个Python字典,通过data
参数传递给requests.post()
方法。requests
库会将其视为表单数据并进行编码。
- 当你使用
总结:
- 使用
json
参数时,数据会被自动序列化为JSON,并设置Content-Type
为application/json
。 - 使用
data
参数时,你可以更灵活地控制数据的格式和请求头,但需要手动处理序列化和请求头的设置。
选择哪种方式取决于你的需求和API的要求。大多数现代Web API都支持JSON格式的数据,因为它是一种轻量级且易于处理的数据交换格式。如果你的API期望接收JSON数据,那么使用json
参数是最简单和最直接的方法。如果你的API期望接收表单数据,或者你需要更多的控制,那么使用data
参数可能更合适。
例子:
import requests
import jsonurl = 'http://192.1***:7889/get_question'response = requests.post(url, headers= {'Content-Type': 'application/json'},data=json.dumps({"text": "水电工"}))
response.json()
2、requests response 接收不同数据
要从requests.post()
方法返回的response
对象中提取结果,你可以使用以下几种方法,具体取决于响应的内容类型:
-
如果响应是JSON格式:
使用response.json()
方法可以直接将响应内容解析为Python字典或列表。import requestsurl = 'http://example.com/api' payload = {'key1': 'value1','key2': 'value2' }response = requests.post(url, json=payload)if response.status_code == 200:result = response.json()print(result) # 打印解析后的JSON对象 else:print(f"Request failed with status code {response.status_code}")
-
如果响应是文本格式:
使用response.text
属性可以获取响应的文本内容。import requestsurl = 'http://example.com/api' payload = {'key1': 'value1','key2': 'value2' }response = requests.post(url, json=payload)if response.status_code == 200:result = response.textprint(result) # 打印响应文本 else:print(f"Request failed with status code {response.status_code}")
-
如果响应是二进制数据:
使用response.content
属性可以获取响应的二进制内容。import requestsurl = 'http://example.com/api' payload = {'key1': 'value1','key2': 'value2' }response = requests.post(url, json=payload)if response.status_code == 200:result = response.content# 处理二进制数据,例如保存文件 else:print(f"Request failed with status code {response.status_code}")
-
如果响应包含表单数据:
使用response.form
属性可以像处理字典一样处理响应中的表单数据。import requestsurl = 'http://example.com/api' payload = {'key1': 'value1','key2': 'value2' }response = requests.post(url, data=payload) # 注意这里使用data而不是jsonif response.status_code == 200:result = response.form.get('key') # 获取表单中的某个字段print(result) else:print(f"Request failed with status code {response.status_code}")
在实际应用中,你应该根据API的文档或响应头中的Content-Type
来确定响应的内容类型,并相应地提取结果。通常,API文档会明确指出响应的格式和结构。