Post 使用 Twisted Web 客户端请求多个参数
Post request with multiple parameters using Twisted Web Client
我想使用 Twisted Web 客户端发送带有多个参数的 POST 请求:
- 图片:图片
- 元数据:json 包含元数据的文档
我需要使用没有像 Treq 和 requests 这样的外部库的纯 Twisted。
目前我只能传一个参数,试了好几种方法都没有成功。
有人知道如何改变 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 当然还有多种实现,您也可以将其用作参考和互操作性测试工具。
我想使用 Twisted Web 客户端发送带有多个参数的 POST 请求:
- 图片:图片
- 元数据:json 包含元数据的文档 我需要使用没有像 Treq 和 requests 这样的外部库的纯 Twisted。
目前我只能传一个参数,试了好几种方法都没有成功。
有人知道如何改变 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 当然还有多种实现,您也可以将其用作参考和互操作性测试工具。