Отправка запроса с несколькими параметрами с помощью Twisted Web Client

Я хотел бы отправить запрос POST с несколькими параметрами с помощью Twisted Web Client:

  • изображение : изображение
  • метаданные: документ json с метаданными. Мне нужно использовать чистый Twisted без внешних библиотек, таких как Treq и запросы.

На данный момент я могу отправить только один параметр и безуспешно пробовал несколько способов.

Кто-нибудь знает, как изменить тело для достижения этой цели?

from __future__ import print_function

from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.web.http_headers import Headers

from bytesprod import BytesProducer

agent = Agent(reactor)
body = BytesProducer(b"hello, world")
d = agent.request(
    b'POST',
    b'http://httpbin.org/post',
    Headers({'User-Agent': ['Twisted Web Client Example'],
             'Content-Type': ['text/x-greeting']}),
    body)

def cbResponse(ignored):
    print('Response received')
d.addCallback(cbResponse)

def cbShutdown(ignored):
    reactor.stop()
d.addBoth(cbShutdown)

reactor.run()

person hotips    schedule 04.01.2021    source источник


Ответы (1)


Вам нужно указать, как вы хотите закодировать параметры. Если вы хотите отправить их как форму в браузере, вам нужно application/x-www-form-urlencoded или multipart/form-data закодировать данные. Первый, как правило, предназначен для коротких данных, и, поскольку ваши параметры - это изображение, оно, вероятно, не является коротким. Таким образом, вы должны multipart/form-data данные.

После этого вы просто объявляете это в заголовке запроса и включаете закодированные данные в тело.

Например,

body = multipart_form_encoded_body_producer(your_form_fields))
d = agent.request(
    b'POST',
    b'http://httpbin.org/post',
    Headers({'User-Agent': ['Twisted Web Client Example'],
             'Content-Type': ['multipart/form-data']}),
    body)

Для удобства treq предоставляет кодировщик multipart/form-data

Итак, multipart_form_encoded_body_producer(...), вероятно, выглядит примерно так:

MultiPartProducer([
    ("image", image_data),
    ("metadata", some_metadata),
    ...
])
   

Вы упомянули, что не можете использовать Treq. Вы не упомянули, почему. Я рекомендую использовать Treq или, по крайней мере, найти другую библиотеку, которая может выполнить кодирование за вас. Если вы не можете сделать это по какой-либо необоснованной причине, вам придется самостоятельно реализовать кодировку multipart/form-data. Он достаточно хорошо задокументирован, и, конечно же, есть несколько реализаций, которые вы также можете использовать в качестве справочных и интероперабельных. инструменты тестирования.

person Jean-Paul Calderone    schedule 04.01.2021
comment
Он встроен с большим количеством ресурсов. Treq имеет длинный список зависимостей и довольно медленно импортируется в наших тестах. Я хотел бы использовать чистое скрученное решение, чтобы избежать этих проблем. В противном случае, я был бы рад использовать Treq.... - person hotips; 05.01.2021
comment
Я попытаюсь использовать исходный код raw.githubusercontent.com. /twisted/treq/master/src/treq/, чтобы получить лучшее из обоих миров. - person hotips; 05.01.2021