世界上最伟大的投资就是投资自己的教育

首页Ruby
随风 · 凡人

使用 Ruby 标准库发起 http 请求

随风发布于2052 次阅读

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 条回复
暂无回复~~
喜欢
我的微信官网服务号精品文章订阅号微信视频号
程序员随风
统计信息
    学员: 21266
    视频数量: 1338
    文章数量: 452

© 汕尾市求知科技有限公司 | 专业版网站 | 关于我们 | 在线学员:1143

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top