我正在创建一个简单的 AWS lambda 函数来将一些数据发布到 API,但 API 需要一个列表,但我无法让它工作。我有以下我正在测试的代码
import urllib3
import json
http = urllib3.PoolManager()
file_path = 'file.png'
with open(file_path, 'rb') as fp:
file_data = fp.read()
payload = {
'from': ['a', 'b', 'c'],
'file': ('file.png', file_data),
}
r = http.request(
'POST',
'http://httpbin.org/post',
fields=payload
)
json.loads(r.data.decode('utf-8'))
但是这会返回一个错误,关于期望该字段是某种类型并且基本上不允许是一个很好的列表,但是我怎样才能让它工作。
我正在连接到基于 Rails 的服务器,为了将表单编码的表单提交作为列表,我需要发送多个名称末尾包含
[]
的参数,当然,如果我尝试创建一个具有多个相同键的字典,它只会忽略它们,所以我不确定如何处理这个。
我是 python 的新手,如果这是一个愚蠢的问题,我很抱歉
以下https://urllib3.readthedocs.io/en/stable/reference/urllib3.fields.html
你可以像这样使用
RequestField
:
import urllib3
from urllib3.fields import RequestField
http = urllib3.PoolManager()
file_path = 'test.png'
with open(file_path, 'rb') as fp:
file_data = fp.read()
fields = []
request_field = RequestField(name='file', data=file_data, filename='test.png')
content_disposition = 'form-data; size=%d' % len(file_data)
request_field.make_multipart(content_disposition=content_disposition, content_type='image/png')
fields.append(request_field)
fields.append(('from', 'a'))
fields.append(('from', 'b'))
fields.append(('from', 'c'))
r = http.request(
'POST',
'http://httpbin.org/post',
fields=fields
)
print(r.data.decode('utf-8'))
注意同一个键的多个值被添加为元组而不是列表。
图像数据为单个像素png的输出为:
{
"args": {},
"data": "",
"files": {
"file": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="
},
"form": {
"from": [
"a",
"b",
"c"
]
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "531",
"Content-Type": "multipart/form-data; boundary=f7d0e07796abdc6d9314a8c5f9782719",
"Host": "httpbin.org",
"User-Agent": "python-urllib3/1.26.9",
"X-Amzn-Trace-Id": "Root=1-64446df8-5397f3f87fedd49d580c581e"
},
"json": null,
"origin": "80.229.247.229",
"url": "http://httpbin.org/post"
}