首页ruby
海外散仙厉飞雨 · 真仙

使用 Ruby 标准库发起 http 请求

hfpp2012发布于

1. 介绍

除了用curl这个工具来发起http请求之外,ruby也有相应的标准库net/http来实现类似的功能,会使用这些功能,就可以很容易地实现一些api的客户端。

2. 使用

下面我们来使用这个库。

2.1 最简单的使用
require 'net/http'

puts Net::HTTP.get('www.rails365.net', '/') # => String

这样会输出整个应答的内容体。

2.2 带参数的请求
require 'net/http'

uri = URI("https://api.weixin.qq.com/customservice/kfaccount/del?access_token=#{@client.get_access_token}&kf_account=#{params[:id]}")
puts Net::HTTP.get(uri)
require 'net/http'

uri = URI('http://www.rails365.net/articles')
params = { :page => 2 }
uri.query = URI.encode_www_form(params)

res = Net::HTTP.get_response(uri)
puts res.body if res.is_a?(Net::HTTPSuccess)

这个带参数的GET请求就能实现部分api的客户端功能了。

但是,有些功能是需要提交数据的,那就得用POST请求了。

2.3 POST请求
uri = URI('http://www.example.com/search.cgi')
res = Net::HTTP.post_form(uri, 'q' => ['ruby', 'perl'], 'max' => '50')
puts res.body

这样就可以简单地POST数据到服务器。但是,一般来说,服务器也不可能让你随便POST数据的,那样很不安全。

有些网站是通过用户名密码的形式来认证,如果是api服务器,有可能是非对称加密来认证,就是通过public key和secret key。

除了之外,有些还要有验证码,如果是rails应用,还有csrf的那个token。

而且上面是通过类似表单(content_type为multipart/form-data)提交数据,但是有些api服务器是需要提交json(content_type为application/json)或xml的。

所以我们需要实现更为复杂的POST请求。

require 'net/http'

uri = URI("https://api.github.com/gists/2710948/comments")
req = Net::HTTP::Post.new(uri.to_s)
req.basic_auth("Username", "Pass")
req.body = '{"body": "Test message"}'  # `to_json` can be used
req["content-type"] = "application/json"
Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
  p response = http.request(req)
end

Net::HTTP.start是建立一个持久链接,在那个块(block)中的代码会利用已有的http链接。

在rail应用中,cookie还是特别重要的,有很多访问都是要带上cookie的,下面的代码是设置cookie的一个演示。

require 'net/http'
require 'cgi'

uri = URI("http://httpbin.org/cookies")
http = Net::HTTP.new(uri.host, 80)
request = Net::HTTP::Get.new(uri.request_uri)
cookie1 = CGI::Cookie.new('usr', 'blah')
request['Cookie'] = cookie1.to_s # <---
r = http.request(request)
puts r.body

另外推荐两篇文章,第一篇文章描述了如何写用标准库写一个api客户端。地址是:http://danknox.github.io/2013/01/27/using-rubys-native-nethttp-library/

完结。

本站帖子均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~

© 汕尾市求知科技有限公司 | 粤ICP备19038915号 | 在线学员:33

Top