Post 使用 Twisted Web 客户端请求多个参数

Post request with multiple parameters using Twisted Web Client

我想使用 Twisted Web 客户端发送带有多个参数的 POST 请求:

目前我只能传一个参数,试了好几种方法都没有成功。

有人知道如何改变 body 来实现这个目标吗?

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()

您需要指定参数的编码方式。如果您想像浏览器表单一样提交它们,您需要对数据进行 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 provides a multipart/form-data encoder

所以 multipart_form_encoded_body_producer(...) 可能类似于:

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

您提到您不能使用 Treq。你没有说为什么。我建议使用 Treq 或至少找到另一个可以为您进行编码的库。如果由于某些不合理的原因你不能这样做,你将不得不自己实现 multipart/form-data 编码。它是 reasonably well documented 当然还有多种实现,您也可以将其用作参考和互操作性测试工具。