class AuthingRuby::Common::HttpClient

Constants

METHODS

Public Class Methods

new(options = {}, tokenProvider = nil) click to toggle source

METHODS = %i[get post put delete head patch options trace]

# File lib/authing_ruby/common/HttpClient.rb, line 61
def initialize(options = {}, tokenProvider = nil)
  @options = options
  @tokenProvider = tokenProvider
end

Public Instance Methods

faraday_conn(config = {}) click to toggle source

目的: 把 Faraday 稍微封装一下,因为 Faraday 不能动态指定方法(文档里没写),不像 js 的 axios。 github.com/lostisland/faraday/blob/main/lib/faraday/connection.rb www.rubydoc.info/github/lostisland/faraday/Faraday/Connection 返回 <Faraday::Response>

# File lib/authing_ruby/common/HttpClient.rb, line 70
def faraday_conn(config = {})
  method = config.fetch(:method, nil)
  if method == nil
    raise "必须传入 method,可选值 #{METHODS.join(', ')}"
  end
  method_downcase = method.downcase # 转成小写
  if METHODS.include?(method_downcase.to_sym) == false
    raise "传入的 method 错误,可选值 #{METHODS.join(', ')}"
  end

  url = config.fetch(:url, nil)
  data = config.fetch(:data, nil) # data 和 body 一回事
  params = config.fetch(:params, nil)
  headers = config.fetch(:headers, nil)

  if method_downcase == 'get'
    conn = Faraday::Connection.new url
    return conn.get nil, params, headers
  end

  if method_downcase == 'post'
    conn = Faraday::Connection.new url
    return conn.post nil, data, headers
  end

  if method_downcase == 'put'
    conn = Faraday::Connection.new url
    return conn.put nil, data, headers
  end

  if method_downcase == 'delete'
    conn = Faraday::Connection.new url
    return conn.delete nil, params, headers
  end
end
request(config = {}) click to toggle source
# File lib/authing_ruby/common/HttpClient.rb, line 106
def request(config = {})
  # 处理 config 里5个参数:method, url, data, params, headers
  method = config.fetch(:method, nil)
  url = config.fetch(:url, nil)
  data = config.fetch(:data, nil) # data 和 body 一回事
  params = config.fetch(:params, nil)
  headers = {
    'x-authing-sdk-version': "ruby:#{AuthingRuby::VERSION}",
    'x-authing-userpool-id': @options.fetch(:userPoolId, ''),
    'x-authing-request-from': @options.fetch(:requestFrom, 'sdk'),
    'x-authing-app-id': @options.fetch(:appId, ''),
    'x-authing-lang': @options.fetch(:lang, ''),
  };

  # 如果用户传了 authorization 进来。
  config_headers_authorization = config.dig(:headers, :authorization)
  if config_headers_authorization != nil
    headers['Authorization'] = config_headers_authorization
  else
    # 如果用户不传 token,就使用 sdk 自己维护的。
    token = @tokenProvider.getToken() if @tokenProvider
    headers['Authorization'] = "Bearer #{token}" if token
  end

  resp = faraday_conn({
    method: method,
    params: params,
    url: url,
    data: data,
    headers: headers,
  })

  # const { code, message } = data;
  # if (code !== 200) {
  #   this.options.onError(code, message, data.data);
  #   throw new Error(JSON.stringify({ code, message, data: data.data }));
  # }
  # return data.data;

  return resp
end