Ruby中与Python Requests库(HTTP客户端)相对应的库是什么?

19

有一个我喜欢的Python库叫做"Requests". Requests是基于urllib3构建的HTTP客户端。"requests doc"。

现在我正在寻找类似于Ruby的东西。基本上我需要:

  • 支持上传文件(multipart/form-data)。
  • 易于使用的GET/POST方法。
  • 可以从响应对象传递Cookie到请求对象(用于手动构建登录脚本)。
  • 稳定且灵活。
  • 支持会话(以免必须手动处理Cookie)。

我看过Typhoeus,但是主页上的代码示例不起作用;他们已经移动了代码,并且get方法不再直接可访问,所以它的开端不太好。Curb似乎不错,我喜欢cURL,还有很流行的rest-client,根据基准测试,em-http似乎非常快。还有Patron和curb-fu,我还没有时间去尝试。当然,还有Net:HTTP。但是,似乎没有一种主流的解决方案被所有人指出。

我想很多人都曾经处于我的情况,我想知道他们选择了什么以及为什么选择了它?

8个回答

11

比较的作者是httpclient的作者,但从外观看来,比较是公平的。

如果您需要更具叙述性的样式,并对矩阵进行一些解释,请查看同一作者的http://www.slideshare.net/HiroshiNakamura/rubyhttp-clients-comparison

比较结果部分有利于httpclient,我也可以推荐它。简单、功能丰富、与所有Ruby平台兼容和高效。比其他任何东西都要好的Cookie支持,但演示文稿提到如果您使用相同的客户端对象,则cookie可能会从一个(恶意)网站泄漏到另一个网站。不知道这是否仍然属实。


是的,对于cookie方面仍然如此。幸运的是,这是一个很大的安全漏洞,只是你可以为“.com.”域名设置cookie。 - Hartator
只要你意识到了它,它可能并不是一个大问题。我认为(不要相信我!请验证!)只要你为两个站点实例化两个不同的对象,你应该没问题。 - clacke
1
不幸的是,httpclient 目前没有得到积极的维护。我发现 Excon 是一个很好的选择。 - w00d
1
https://github.com/nahi/httpclient 的最新版本是“2014年6月8日 - 版本2.4.0”。httpclient正在积极维护中。它已经非常接近完美,不需要太多更新。;-) - clacke

7

6

内置的OpenURI是首选,它简单易用且处理基本操作得心应手。

Typhoeus是一个很好用的并行处理工具,我已经多次使用过。有关文档代码库可在Github上查看。

irb(main):009:0> response = Typhoeus::Request.get("www.example.com")
=> #<Typhoeus::Response:0x007ffbcc067cf8 @code=302, @curl_return_code=0, @curl_error_message="No error", @status_message=nil, @http_version=nil, @headers="HTTP/1.0 302 Found\r\nLocation: http://www.iana.org/domains/example/\r\nServer: BigIP\r\nConnection: close\r\nContent-Length: 0\r\n\r\n", @body="", @time=0.035584, @requested_url=nil, @requested_http_method=nil, @start_time=nil, @start_transfer_time=0.035529, @app_connect_time=2.8e-05, @pretransfer_time=0.000429, @connect_time=2.8e-05, @name_lookup_time=2.8e-05, @request=:method => :get,
    :url => www.example.com, @effective_url="HTTP://www.example.com", @primary_ip="192.0.43.10", @redirect_count=0, @mock=false>
irb(main):010:0> puts response.headers
HTTP/1.0 302 Found
Location: http://www.iana.org/domains/example/
Server: BigIP
Connection: close
Content-Length: 0

我偶尔也使用Net::HTTP,但是OpenURI和Typhoeus,以及Hydra,已经证明它们易于使用并且可以与我的代码集成。


4

你看过 HTTParty 这个 Ruby gem 吗?


4
我最终找到了这个HTTPClient:https://github.com/nahi/httpclient
我已经开始使用它,它符合我想要的功能,并且根据某些基准测试结果显示,它非常快。它还支持一些高级功能,例如流式传输或分块响应。不过,很遗憾它在Ruby社区中并不著名。 :)

2

很抱歉听到 Typhoeus 对您没用。原因是 README 显示如何使用 Typhoeus v0.5.0.rc,可以通过以下方式安装:

gem install typhoeus --pre

或者

gem "typhoeus", git: "git://github.com/typhoeus/typhoeus.git"

Typhoeus不支持会话,但除此之外,它可能非常适合。至少它非常稳定,因为它建立在libcurl之上。
文件发送示例:
Typhoeus.post("www.example.com/file", body: { file: File.open("testfile.txt","r") })

很遗憾,处理cookie没有捷径,您必须手动设置它们:
Typhoeus.get("www.example.com/needs_cookie", headers: { Cookie: "PRIVATE" })

TLDR: 如果你想要速度快一些,我会选择Typhoeus,如果你愿意自己设置的话,可以选择libcurl。否则,我建议使用Faraday,并与Typhoeus适配器一起使用。
编辑:我已经在README中添加了安装说明。
编辑:0.5版本已发布。

2
如果您需要使用 cookies 和表单处理,mechanize 是唯一可行的方法。请注意保留 HTML 标签。

我认为 mechanize 模拟了整个浏览器,对吗? - Hartator
我经常使用httpclient。当你想要轻量级的东西时,它是一个很棒的库。但它不能完成你列表上的所有事情,而 mechanize 可以。 - pguardiario
如果你没有对我的回答进行负评,我可能会倾向于告诉你。 - pguardiario
除非您进行编辑,否则我无法更改我的投票。 (可以进行微小的更改,例如添加笑脸)。我很好奇。 :) - Hartator

1
这个问题似乎缺少最近的答案。所以我来填补一下空白。
我自己使用Python,并且非常喜欢requests库,因为它可以轻松地完成任务。最近我发现了一个非常好的Ruby库rest_client,它支持问题中提到的所有功能,并且从可用性的角度来看似乎非常好 - 这也是requests库的目标。

最终使用了 http.rb。还可以。 - Hartator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接