07/09/2018, 18:08

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 cthứ 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 ccác middleware.

conn.get do |req|
  req.url '/search'
  req.options.context = {
      foo: 'foo',
      bar: 'bar'
  }          
end
0