繁体   English   中英

带有python附件的Urllib3 POST请求

[英]Urllib3 POST request with attachment in python

我希望在 python 中使用 urllib3 添加附件但没有成功。 我已经确认 API 本身在邮递员中工作,但无法弄清楚如何将此请求转换为 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)

邮递员 - 它也可以正常工作并正确发送文件名(我猜它会将字节和文件名分开?) 在此处输入图片说明

在此处输入图片说明

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

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

对于那些从谷歌博士偶然发现这一点的人来说:

  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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM