Python 将 http post body 扭曲转发到 tcp 端口

Posted

技术标签:

【中文标题】Python 将 http post body 扭曲转发到 tcp 端口【英文标题】:Python twisted forward http post body to tcp port 【发布时间】:2021-10-16 10:47:34 【问题描述】:

我有一个在 localhost 的 9999 端口上运行的回显服务器。我正在使用 twisted 开发一个 Web 服务器(我通常是 twisted 和 python 的新手)。客户端将使用带有 HTTP 的分块编码流式传输数据。我希望服务器做的是将此数据发送到端口 9999 并从那里获取响应并作为 http 响应写回。但我什至无法使发送部分工作。这是我到目前为止所做的。

从 twisted.web 导入服务器,资源 从 twisted.internet 导入反应器,端点 从 twisted.internet.protocol 导入协议,工厂 类 Clientp(协议): def __init__(self, req): self.req = 请求 def connectionMade(self): self.transport.writeSequence(self.req.content.read()) 定义数据接收(自我,数据): print ("+得到回复" + str(data)) # 我必须在这里通过 resposne 发送数据 类计数器(资源。资源): isLeaf = 真 numberRequests = 0 def render_POST(self, request): 定义客户端协议(): 返回客户端(请求) 端点=端点。TCP4ClientEndpoint(反应器,“127.0.0.1”,9999) 端点.connect(Factory.forProtocol(clientProtocol)) 返回 server.NOT_DONE_YET endpoints.serverFromString(reactor, "tcp:8000").listen(server.Site(Counter())) 反应堆.run()

我无法将帖子内容 (request.content.read()) 写入 TCP 端点。我收到TypeError("Data must be bytes") 错误。有什么想法

【问题讨论】:

【参考方案1】:
def connectionMade(self):
    self.transport.writeSequence(self.req.content.read())

ITransport.writeSequence 接受一个可迭代的字节。 IRequest.content.read 返回一个字节对象。

您会收到错误 TypeError("Data must be bytes"),因为在 Python 3 中迭代字节会产生整数。实现抱怨的正是这些整数。

您应该改用ITransport.write。

【讨论】:

感谢您的回答。即使我使用ITransport.write,echoserver 也不会收到self.req.content.read() 值。代码还有其他问题吗? 由于来自http客户端的请求数据是分块的,它应该被流式传输到回显服务器。这是正确的方法吗?请原谅我,因为我是扭曲的新手 你怎么知道回显服务器没有收到? 我在 echo 服务器上做一个print。如果我添加self.transport.write('test string'.encode("utf-8"),它会通过,但不会通过self.transport.write(self.req.content.read())。如果我不使用分块编码,数据甚至都没有。 我建议您将这些详细信息添加到新问题中。我想这一个答案。 SO 不太适合聊天式交互。

以上是关于Python 将 http post body 扭曲转发到 tcp 端口的主要内容,如果未能解决你的问题,请参考以下文章

servlet 怎么获取http post 的body

当 HTTP-POST 有 body 时,url 参数为空

get和post的方法的区别(HTTP协议的主要方法都有哪些?)

python post请求携带json body

POST请求一定要带body吗?

DW里动态或静态安扭源代码