在 urllib3 中发布列表字段

问题描述 投票:0回答:1

我正在创建一个简单的 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 的新手,如果这是一个愚蠢的问题,我很抱歉

python urllib3
1个回答
0
投票

以下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"
}
© www.soinside.com 2019 - 2024. All rights reserved.