class Apicalypse::Request

Public Class Methods

new(uri, options) click to toggle source
# File lib/apicalypse/request.rb, line 6
def initialize(uri, options)
  @uri = uri
  @options = options
end

Public Instance Methods

perform(scope) click to toggle source
# File lib/apicalypse/request.rb, line 11
def perform(scope)
  uri = build_uri(scope)
  body = build_body(scope)

  response = http_get(uri, body)
  raise_on_http_error(response)

  JSON.parse(response.body)
end

Private Instance Methods

build_body(scope) click to toggle source
# File lib/apicalypse/request.rb, line 37
def build_body(scope)
  return scope.chain[:query] if scope.chain[:query]

  scope.chain.map do |k, v|
    if v.is_a?(Hash)
      "#{k} #{v.keys[0]}=#{v.values[0]};"
    else
      "#{k} #{v};"
    end
  end.join('')
end
build_uri(scope) click to toggle source
# File lib/apicalypse/request.rb, line 23
def build_uri(scope)
  uri = URI(@uri)

  return uri unless query_method_url?

  uri.query = if scope.chain[:query]
                scope.chain[:query]
              else
                scope.chain.to_query
              end

  uri
end
http_get(uri, body) click to toggle source
# File lib/apicalypse/request.rb, line 49
def http_get(uri, body)
  Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
    req = Net::HTTP::Get.new(uri, request_headers)
    req.body = body unless query_method_url?

    http.request req
  end
end
query_method_url?() click to toggle source
# File lib/apicalypse/request.rb, line 71
def query_method_url?
  @options[:query_method] == :url
end
raise_on_http_error(response) click to toggle source
# File lib/apicalypse/request.rb, line 65
def raise_on_http_error(response)
  return if response.is_a? Net::HTTPSuccess

  raise "Request failed with status #{response.code}: #{response.body}"
end
request_headers() click to toggle source
# File lib/apicalypse/request.rb, line 58
def request_headers
  headers = { 'Accept' => 'application/json' }
  headers.merge!(@options[:headers]) if @options[:headers]

  headers
end