Ruby Net::HTTP.post_form 如何读取长连接的数据?

cdredfox · 2012年06月21日 · 最后由 cdredfox 回复于 2012年06月22日 · 5590 次阅读

问题是这样的:

对方网站提供了一个长连接,我通过 Net::HTTP.post_form 提交请求到长连接的地址,会和服务器建立一个长连接,可以不停的从这个长连接中读取一些数据。(对方要求以 post 请求提交) 我目前通过 Net::HTTP.post_form 这种方式提交,在提交后,就一至卡在哪儿,然后等了一段时间后,就直接报错了: Errno::ETIMEDOUT: Operation timed out - connect(2)

我想请求一下,对于这种长连接取值的方式,是否可以使用 Net::HTTP.post_form 提交请求?或者 Ruby 中有其它的解决方式?

非常谢谢~!

有一个 Gem,提供了对 HTTP persistent connections 的支持,你看看是不是你要的? https://github.com/drbrain/net-http-persistent

你看看 faraday 这个 gem 行不?

@lgn21st 我刚尝试了一下 net-http-persistent 这个 Gem,按着他的官方说明的代码尝试了一下,还是过一段时间后,会报 Errno::ETIMEDOUT: Operation timed out - connect(2)

@alice 看了一下 faraday 这个 gem 的文档,貌似它没有这个功能,他主要是包装了 net/http 的一些接口? 你说的是这个吗?https://github.com/technoweenie/faraday

对,它仅仅是封装了一下 ruby/http,post 数据可以,好像不能维持长连接....

我觉得这里有个误解,长连接Streaming (chunk) 通常指的是 HTTP 的两个不同的概念。

长连接是指 HTTP 1.1 里面,当服务器返回的的 Response 中包含了 keep-alive 后,浏览器后续发起的请求将不会在重新做 TCP handshake,而是使用上一次请求的 TCP 连接,这样增加了请求的效率。

根据楼主的文字描述,这里应该是 Streaming,即服务器一直 hold response,并分批次返回内容,所以 net-http-persistent 不是用来解决 Streaming 问题的。

我简单查了一下,Faraday 对 HTTP Streaming 的支持是在 TODO 里面的,但是老牌的 HTTPClient 倒是支持,你不妨试试看:https://github.com/nahi/httpclient

== Features
* asynchronous HTTP request, streaming HTTP request.

试了一下,用 HTTPClient 是可以处理的,谢谢两位

需要 登录 后方可回复, 如果你还没有账号请 注册新账号