Urllib3 POST 带有附件的请求 python

Urllib3 POST request with attachment in python

我想发出 post 请求以在 python 中使用 urllib3 添加附件但没有成功。我已经确认 API 本身在 postman 中工作,但无法确定如何将此请求转换为 python。感谢我正在混合对象类型,我只是不知道如何避免它。

Python代码:

import urllib3
import json

api_key = "secret_key"
header = {"X-API-KEY": api_key, "ACCEPT": "application/json", "content-type": "multipart/form-data"}
url = "https://secret_url.com/api/"
http = urllib3.PoolManager()

with open("invoice.html", 'rb') as f:
    file_data = f.read()

payload = {
        "attchment": {
            "file": file_data
        }
    }

payload = json.dumps(payload)
r = http.request('post', url, headers = header, fields = payload)

print(r.status)
print(r.data)

Postman - 它可以正常工作并通过它正确发送文件名(我猜它会将字节和文件名分开?)

编辑:我也尝试过请求库,因为我对此更熟悉(但不能使用它,因为脚本将在 AWS lambda 中 运行ning)。从字典中删除附件元素允许它 运行 但 API 端点给出 401 大概是因为它缺少数据结构的“附件”部分,如下面的 postman...但是当我把它放进去时,我得到了运行时间错误。

r = requests.post(url, headers = header, files={"file": open("invoice.html", 'rb')})

对于从 google 博士那里偶然发现此内容的任何人,请注意几点:

  1. 我完全误解了元素的结构。它实际上是一个字符串 "attachment[file]" 而不是一个类似对象的字典。
  2. Postman 能够以 urllib/request 语法输出 python 代码,尽管不是我所追求的 100%。注意:chrome 版本(已折旧)输出的乱码只有一半有效,因此应使用客户端版本。下面的一小部分工作表明它按预期工作:
http = urllib3.PoolManager()

with open("invoice.html", "rb") as f:
    file = f.read()

payload={
  'attachment[file]':('invoice.html',file,'text/html')
}

r = http.request('post', url, headers = header, fields = payload)