Gem Faraday
Faraday là một thư viện HTTP client cung cấp interface dùng chung cho nhiều adapter (như Net::HTTP, HTTPClient) và nó cũng bao gồm các khái niệm về middleware rack khi xử lý vòng đời của request/response. Faraday hỗ trợ một số adapter như bên dưới: Net::HTTP (default) Net::HTTP::Persistent ...
Faraday là một thư viện HTTP client cung cấp interface dùng chung cho nhiều adapter (như Net::HTTP, HTTPClient) và nó cũng bao gồm các khái niệm về middleware rack khi xử lý vòng đời của request/response.
Faraday hỗ trợ một số adapter như bên dưới:
- Net::HTTP (default)
- Net::HTTP::Persistent
- Excon
- Patron
- EventMachine
- HTTPClient
Nó cũng bao gồm một rack adapter để tải các ứng dụng thông qua Rack::Test và một test adapter cho stubbing request. Có thể tìm hiểu kỹ hơn về khái niệm tại đây.
Sử dụng cơ bản
response = Faraday.get 'http://sushi.com/nigiri/sake.json'
Ví dụ đơn giản là tạo một request lấy dữ liệu với phương thức GET được thực hiện với cú pháp như bên trên. Nó sẽ hoạt động nếu bạn không cần phải thiết lập bất cứ điều gì.
Một cách linh hoạt hơn và tối ưu hơn để sử dụng Faraday là hãy tạo một đối tượng kết nối(instance), nếu bạn muốn giữ một giá trị mặc định như nhau(ko thay đổi endpoint), có thể sử dụng như bên dưới.
conn = Faraday.new(:url => 'http://www.example.com')
response = conn.get '/users' # GET http://www.example.com/users'
Các kết nối cũng có thể lấy một Hash như là một tham số hoặc được cấu hình bằng cách sử dụng một khối. Kiểm tra phần được gọi là sử dụng một middleware nâng cao với nhiều chi tiết về làm thế nào sử dụng khối này để cấu hình.
conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
faraday.request :url_encoded # form-encode POST params
faraday.response :logger # log requests to STDOUT
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
end
# Tạo một filter để lọc các thông tin nhạy cảm. filter kết hợp với cú pháp REGEX
conn = Faraday.new(:url => 'http://sushi.com/api_key=s3cr3t') do |faraday|
faraday.request :url_encoded # form-encode POST params
faraday.response :logger do | logger |
logger.filter(/(api_key=)(w+)/,'1[REMOVED]')
end
faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
end
Khi bạn đã kết nối đối tượng, sử dụng nó để làm các yêu cầu HTTP. Bạn có thể pass qua các paramters theo một số cách khác nhau.
## GET ##
response = conn.get '/nigiri/sake.json' # GET http://sushi.com/nigiri/sake.json
response.body
conn.get '/nigiri', { :name => 'Maguro' } # GET http://sushi.com/nigiri?name=Maguro
conn.get do |req| # GET http://sushi.com/search?page=2&limit=100
req.url '/search', :page => 2
req.params['limit'] = 100
end
## POST ##
conn.post '/nigiri', { :name => 'Maguro' } # POST "name=maguro" to http://sushi.com/nigiri
Một số tùy chọn cấu hình có thể được điều chỉnh theo mỗi request
# POST method sử dụng JSON thay vì mã hóa với "www-form-urlencoded":
conn.post do |req|
req.url '/nigiri'
req.headers['Content-Type'] = 'application/json'
req.body = '{ "name": "Unagi" }'
end
## Tùy chọn
conn.get do |req|
req.url '/search'
req.options.timeout = 5 # open/read timeout in seconds
req.options.open_timeout = 2 # connection open timeout in seconds
end
Bạn có thể chèn các dữ liệu tùy ý vào trong request sử dụng context:
# Bất cứ thứ gì bạn có thể chèn bằng cách sử dụng context sẽ có sẵn trong môi trường(env) trên tất cả các middleware.
conn.get do |req|
req.url '/search'
req.options.context = {
foo: 'foo',
bar: 'bar'
}
end