`

用Ruby做Get网络请求

    博客分类:
  • ruby
阅读更多
使用ruby发起网络请求,需要用到'net/http',下面的程序是获得一个对url请求的
响应

其实最简单的方法是
>>require "open-uri"
>>open("http://www.cnblog.org/blog/atom.xml")

但是,这个方法的缺点是太简单,无法设置超时时间。在超时的情况下,他会无限的请求下去,直到达到了默认的超时时间,这个时间很长
>> open("http://www.cnblog.org/blog/atom.xml")
Errno::ETIMEDOUT: Connection timed out - connect(2)
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:560:in `initialize'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:560:in `open'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:560:in `connect'
        from /usr/local/bin/rubyee/lib/ruby/1.8/timeout.rb:53:in `timeout'
        from /usr/local/bin/rubyee/lib/ruby/1.8/timeout.rb:93:in `timeout'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:560:in `connect'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:553:in `do_start'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:542:in `start'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:242:in `open_http'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:162:in `catch'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:518:in `open'
        from /usr/local/bin/rubyee/lib/ruby/1.8/open-uri.rb:30:in `open'
        from (irb):6>>




为了保险起见,在要考虑超时处理或者其他设定的情况下,还是使用Net::HTTP
除了能设置超时时间之外,还能设置其他的请求参数,例如user-agent

这个user-agent还是很有用的参数,先前在拿163.com做实验的时候,没有设个参数,结果老是重定向,把这个请求当做了手机端的

class HandleGetRequest
  # 对url发起get请求
  require 'net/http'

  def self.get_response(url)
    begin
      url_str = URI.parse(url)
      site = Net::HTTP.new(url_str.host, url_str.port)
      site.open_timeout = 20
      site.read_timeout = 20
      path = url_str.query.blank? ? url_str.path : url_str.path+"?"+url_str.query
      return site.get2(path,{'accept'=>'text/html','user-agent'=>'Mozilla/5.0'})
    rescue Exception => ex
      p ex
    end
  end

end



请求一个正常的网址
>> HandleGetRequest.get_response("http://www.iteye.com/topic/431217")
=> #<Net::HTTPOK 200 OK readbody=true>


如果后面的path为空 注意斜杠

>> HandleGetRequest.get_response("http://www.google.com.hk")
#<ArgumentError: HTTP request path is empty>
=> nil
>> HandleGetRequest.get_response("http://www.google.com.hk/")
=> #<Net::HTTPOK 200 OK readbody=true>


请求一个超时的网址(在我机器上测试时超时的),会在设定的时间到达时抛出异常

>> HandleGetRequest.get_response("http://www.cnblog.org/blog/atom.xml")
#<Timeout::Error: execution expired>
Timeout::Error: execution expired
        from /usr/local/bin/rubyee/lib/ruby/1.8/timeout.rb:60:in `open'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:560:in `connect'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:560:in `connect'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:553:in `do_start'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:542:in `start'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:1035:in `request'
        from /usr/local/bin/rubyee/lib/ruby/1.8/net/http.rb:948:in `get2'
        from /home/chengliwen/chengliwen/deploy/pin-macro-tmp/lib/handle_get_request.rb:30:in `get_response'
        from (irb):1


然后可以根据响应值,去处理response的body了


分享到:
评论
2 楼 hotsunshine 2010-12-02  
googya 写道
  path = url_str.query.blank? ? url_str.path : url_str.path+"?"+url_str.query  


字符串好像没有blank?这个方法吧(我的是1.9.2)。
如果url 为 www.google.com之类的,那么url_str.path会是空的,会报错的!


这个blank?方法是rails提供的
关于path空,是因为路径斜杠的问题


>> HandleGetRequest.get_response("http://www.google.com.hk")  
#<ArgumentError: HTTP request path is empty>  
=> nil  
>> HandleGetRequest.get_response("http://www.google.com.hk/")  
=> #<Net::HTTPOK 200 OK readbody=true> 
1 楼 googya 2010-12-01  
  path = url_str.query.blank? ? url_str.path : url_str.path+"?"+url_str.query  


字符串好像没有blank?这个方法吧(我的是1.9.2)。
如果url 为 www.google.com之类的,那么url_str.path会是空的,会报错的!

相关推荐

    Ruby-HttpLogHTTP请求日志输出

    例如,如果你使用HTTParty发送一个GET请求: ```ruby require 'httparty' HttpLog.instrument response = HTTParty.get('https://api.example.com/data') ``` HttpLog将输出类似以下的日志: ``` DEBUG -- : ...

    Ruby-Typhoeus封装libcurl让http请求更快和可靠

    例如,你可以通过以下代码发送一个简单的GET请求: ```ruby require 'typhoeus' request = Typhoeus::Request.new("http://example.com", method: :get) response = request.run puts response.body ``` 对于更...

    Ruby-RESTClient简单的HTTP和Ruby的REST客户端

    5. **错误处理**:当HTTP请求出现错误时,如网络问题或服务器返回非2xx状态码,RESTClient会抛出异常,方便开发者捕获并处理错误。 6. **认证支持**:RESTClient支持基本认证、OAuth以及自定义认证方案。例如,使用...

    Ruby-HttpClient在Ruby中提供类似libwwwperlLWP的功能

    4. 发送请求并获取响应:`response = client.get(url)` 5. 处理响应,如读取响应体、检查状态码等。 通过HttpClient,Ruby开发者可以轻松地实现网络爬虫、自动化测试、API调用等各种HTTP相关的任务,其易用性和灵活...

    ios-iOS数据的网络请求.zip

    1. GET请求: ```objc [[AFHTTPSessionManager manager] GET:@"http://example.com/resources.json" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@...

    Ruby-httparty让http有趣

    在这个例子中,`base_uri`定义了API的基础URL,`get`方法用于发送GET请求,`parsed_response`则将返回的HTTP响应体转换为Ruby对象(通常为JSON)。 httparty还支持POST请求,可以方便地发送JSON数据: ```ruby def...

    apache mod_ruby

    2. **Ruby Handler**:你可以定义特定的处理器(handler)来处理不同的HTTP请求方法,比如GET、POST等。 3. **Ruby重写规则**:结合使用mod_rewrite,你可以创建复杂的URL重写规则,将用户友好的URL映射到Ruby脚本。...

    ios-基于YTKNetwork的网络请求.zip

    在iOS开发中,网络请求是应用的核心组成部分,用于获取服务器数据并展示给用户。YTKNetwork是一个基于AFNetworking的网络库,它提供了更高级别的抽象和便利性,使得网络请求管理更加规范和高效。本教程将详细介绍...

    Ruby-从FM网站如获取音频并转换到MP3格式

    例如,如果音频URL可以通过HTTP GET请求获取,你可以用如下代码: ```ruby require 'httparty' response = HTTParty.get('http://example.fm/audio_url') audio_data = response.body ``` 描述中的"FM网站"可能是...

    Ruby-RubyJMeter一个基于Ruby的DSL用于构建JMeter测试计划

    然后,我们添加了一个HTTP采样器,模拟用户对Google首页的GET请求。 Ruby-JMeter支持多种JMeter组件,包括HTTP、FTP、TCP、SMTP、JDBC等协议的采样器,以及各种响应断言和定时器。例如,你可以使用以下代码添加一个...

    Ruby-Faraday简单但灵活的HTTP客户端库支持多种后端

    例如,以下是如何使用Faraday发起一个GET请求: ```ruby require 'faraday' conn = Faraday.new('http://example.com') do |faraday| faraday.response :logger # log requests to STDOUT faraday.adapter ...

    针对网络请求的测试框架.zip

    它的设计灵感来自于Ruby的著名库VCR,旨在简化网络服务的单元测试和集成测试。通过DVR,开发者可以录制和重放网络请求,从而在测试环境中模拟真实的网络行为,而无需实际访问远程服务器。 首先,DVR的核心功能是...

    Ruby程序中发送基于HTTP协议的请求的简单示例

    #如果有GET请求参数直接写在URI地址中 uri = 'http://uri' html_response = nil open(uri) do |http| html_response = http.read end puts html_response require open-uri #如果有GET请求参数直接写在URI地址中 uri...

    swift-Swift3.0环境下使用AFNetworking封装网络请求业务类

    接下来,我们可以实现GET请求的方法: ```swift func get(url: String, parameters: [String: Any]?, completion: @escaping (Data?, URLResponse?, Error?) -&gt; Void) { manager.get(url, parameters: parameters,...

    Ruby-PatronRuby基于libcurl的HTTP客户端

    例如,发起一个GET请求: ```ruby session = Patron::Session.new session.base_url = "http://example.com" response = session.get "/" puts response.body ``` 这里,`Patron::Session`是主要的工作对象,...

    Ruby+for+Rails

    Rails的ORM(对象关系映射)层,允许开发者用Ruby对象操作数据库。每个模型类对应数据库表,实例方法对应SQL查询。例如,`Book.find_by(title: '某书名')`会查找标题为指定值的书籍。 9. ** erb模板** ERB...

    Ruby-Her一个ORM对象关系映射将REST资源映射成Ruby对象

    例如,创建一个新的资源对应于POST请求,读取资源对应于GET请求,更新资源对应于PUT或PATCH请求,删除资源则对应于DELETE请求。 Her库的核心特性包括: 1. **模型映射**:Her允许定义模型类,这些类与REST资源对应...

    Install Ruby on Linux

    在Linux系统上安装Ruby on Rails和Lighttpd是一项常见的任务,尤其对于开发者来说,搭建这样的环境是构建Web应用的基础。Ruby on Rails是一个基于Ruby语言的开源Web开发框架,而Lighttpd则是一款轻量级的HTTP服务器...

    swift-afnetwork 网络请求的实现

    下面是一个简单的GET请求示例: ```swift let manager = AFHTTPSessionManager() manager.requestSerializer = AFJSONRequestSerializer() manager.GET("https://api.example.com/data", parameters: nil, progress...

    Ruby API 帮助文档.zip

    6. **标准库**: Ruby的标准库是一系列预先打包的模块和类,提供各种通用功能,如文件操作、网络通信、日期和时间处理等。例如,`File`类用于处理文件和目录,`Net::HTTP`用于HTTP请求。 7. **Gem**: Gem是Ruby的包...

Global site tag (gtag.js) - Google Analytics