如何将 json 字典作为多部分表单 API 请求调用中的字段发送?
How to send a json dictionary as a field in a Multipart Form API Requests call?
我正在尝试使用 Python 中的请求发送 POST API 呼叫,但我 运行 遇到了如何传递两个 json 数据和多部分文件同时存在。我可以让它在 Insomnia 中工作,但是在 Python 模块中用我正在填充的变量重新创建它很困难。
API 文档说有两个参数 -- file
和 metadata
。 metadata
是一个 json 对象,包含 matter
、title
和 description
等键。 matter
是必需的。我查看过的所有选项的结果都是缺少 matter
参数。
我试过使用 requests_toolkit
并且它是多部分编码器:
matter_id = 5
payload_data = {}
payload_data['matter'] = matter_id
mp_encoder = MultipartEncoder(fields={'metadata': "{" + str(payload_data) + "}", 'file': (None, open(file_path, 'rb'), 'text/plain') })
response = requests.post(url, data=mp_encoder, headers={'Content-Type': mp_encoder.content_type}, auth=(apiuser, apipassword))
如果我没有使用 str(payload_data)
,我会遇到编码错误。我尝试添加额外的 {}
但这似乎也没有实现。
我试过 requests
:
matter_id = 5
payload_data = {}
payload_data['matter'] = matter_id
file_content = {'file': open(file_path, 'rb')}
payload = {'metadata': payload_data}
response = requests.post(url, data=payload, files=file_content, auth=(apiuser, apipassword))
我也尝试了 payload=payload
、params=payload
而不是 data=payload
,但没有成功。
在上面的例子中,我尝试将payload
和file_content
组合成一个字典来传入files
参数:
payloadv2 = {'file': (None, open(file_path, 'rb')), 'metadata': (None, {'matter': matter_id})}
那也没用。
您应该使用 json.dumps(payload_data)
将 python dict 转换为 JSON 字符串表示,而不是连接 "{"
和 "}"
,因为后者可能容易出错.
我正在尝试使用 Python 中的请求发送 POST API 呼叫,但我 运行 遇到了如何传递两个 json 数据和多部分文件同时存在。我可以让它在 Insomnia 中工作,但是在 Python 模块中用我正在填充的变量重新创建它很困难。
API 文档说有两个参数 -- file
和 metadata
。 metadata
是一个 json 对象,包含 matter
、title
和 description
等键。 matter
是必需的。我查看过的所有选项的结果都是缺少 matter
参数。
我试过使用 requests_toolkit
并且它是多部分编码器:
matter_id = 5
payload_data = {}
payload_data['matter'] = matter_id
mp_encoder = MultipartEncoder(fields={'metadata': "{" + str(payload_data) + "}", 'file': (None, open(file_path, 'rb'), 'text/plain') })
response = requests.post(url, data=mp_encoder, headers={'Content-Type': mp_encoder.content_type}, auth=(apiuser, apipassword))
如果我没有使用 str(payload_data)
,我会遇到编码错误。我尝试添加额外的 {}
但这似乎也没有实现。
我试过 requests
:
matter_id = 5
payload_data = {}
payload_data['matter'] = matter_id
file_content = {'file': open(file_path, 'rb')}
payload = {'metadata': payload_data}
response = requests.post(url, data=payload, files=file_content, auth=(apiuser, apipassword))
我也尝试了 payload=payload
、params=payload
而不是 data=payload
,但没有成功。
在上面的例子中,我尝试将payload
和file_content
组合成一个字典来传入files
参数:
payloadv2 = {'file': (None, open(file_path, 'rb')), 'metadata': (None, {'matter': matter_id})}
那也没用。
您应该使用 json.dumps(payload_data)
将 python dict 转换为 JSON 字符串表示,而不是连接 "{"
和 "}"
,因为后者可能容易出错.