如何将 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 文档说有两个参数 -- filemetadatametadata 是一个 json 对象,包含 mattertitledescription 等键。 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=payloadparams=payload 而不是 data=payload,但没有成功。

在上面的例子中,我尝试将payloadfile_content组合成一个字典来传入files参数:

payloadv2 = {'file': (None, open(file_path, 'rb')), 'metadata': (None, {'matter': matter_id})}

那也没用。

您应该使用 json.dumps(payload_data) 将 python dict 转换为 JSON 字符串表示,而不是连接 "{""}",因为后者可能容易出错.