twisted.web.http.HTTPClient收到全部响应内容时是否实现了回调?

1 投票
2 回答
602 浏览
提问于 2025-04-16 19:35

文档上说,当响应完全接收完毕时,会调用'handleResponseEnd'这个函数。

http://twistedmatrix.com/documents/11.0.0/api/twisted.web.http.HTTPClient.html#handleResponseEnd

不过,调试的时候发现,这个说法并不总是正确。当对同一个网址发起多个请求时,这个函数似乎只在第一次请求时被调用。而对不同的网址发起多个请求时,它同样只在第一次请求时被调用。

这种行为是正常的吗?对同一个网址发起多次请求是有道理的,因为通常返回的响应是“304 未修改”,这样客户端就不会重复收到内容。不过,我还是希望能有一个回调函数来告诉我“我们已经完成接收响应了”。

有没有其他更合适的回调函数,可以用来获取完整的响应呢?

2 个回答

0

我昨晚其实搞明白了。我的一个子类是从HTTPClient继承来的。在重写connectionMade这个方法时,我忘了调用父类的connectionMade。因为connectionMade就像是协议的默认构造函数,所以实例没有被正确配置。

虽然我不知道这个解决方案的每一个细节,但在测试中它已经证明是可靠的。之前出现的问题都消失了。

0

通常情况下,你会为每个请求创建一个新的 HTTPClient,方法是通过你的工厂调用 buildProtocol()。这就是 HTTPPageGetterAgent 所做的事情。

不过,有一种情况是例外,那就是使用 HTTP 持久连接的时候。

你在做什么,为什么需要在多个请求中使用同一个协议实例呢?

撰写回答