Class: Parliament::Request::BaseRequest

Inherits:
Object
  • Object
show all
Defined in:
lib/parliament/request/base_request.rb

Overview

Base request object, allowing the user to make a request to an API.

Since:

  • 0.7.5

Direct Known Subclasses

UrlRequest

Class Attribute Summary collapse

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base_url: nil, headers: nil, builder: nil, decorators: nil) ⇒ BaseRequest

Creates a new instance of Parliament::Request::BaseRequest.

An interesting note for #initialize is that setting base_url on the class, or using the environment variable PARLIAMENT_BASE_URL means you don’t need to pass in a base_url. You can pass one anyway to override the environment variable or class parameter. Similarly, headers can be set by either settings the headers on the class, or passing headers in.

Examples:

Setting the base_url on the class

Parliament::Request::BaseRequest.base_url = 'http://example.com'

Parliament::Request::BaseRequest.new.base_url #=> 'http://example.com'

Setting the base_url via environment variable

ENV['PARLIAMENT_BASE_URL'] #=> 'http://test.com'

Parliament::Request::BaseRequest.new.base_url #=> 'http://test.com'

Setting the base_url via a parameter

Parliament::Request::BaseRequest.base_url #=> nil
ENV['PARLIAMENT_BASE_URL'] #=> nil

Parliament::Request::BaseRequest.new(base_url: 'http://example.com').base_url #=> 'http://example.com'

Overriding the base_url via a parameter

ENV['PARLIAMENT_BASE_URL'] #=> 'http://test.com'

Parliament::Request::BaseRequest.new(base_url: 'http://example.com').base_url #=> 'http://example.com'

Setting the headers on the class

Parliament::Request::BaseRequest.headers = { 'Accept' => 'Test' }

Parliament::Request::BaseRequest.new.headers #=> '{ 'Accept' => 'Test' }

Setting the headers via a parameter

Parliament::Request::BaseRequest.headers #=> nil

Parliament::Request::BaseRequest.new(headers: '{ 'Accept' => 'Test' }).headers #=> { 'Accept' => 'Test' }

Overriding the headers via a parameter

Parliament::Request::BaseRequest.headers = { 'Accept' => 'Test' }

Parliament::Request::BaseRequest.new(headers: '{ 'Accept' => 'Test2' }).headers #=> { 'Accept' => 'Test2' }

Parameters:

  • base_url (String) (defaults to: nil)

    the base url of our api. (expected: example.com - without the trailing slash).

  • headers (Hash) (defaults to: nil)

    the headers being sent in the request.

  • builder (Parliament::Builder) (defaults to: nil)

    the builder to use in order to build a response.

Since:

  • 0.7.5



57
58
59
60
61
62
63
# File 'lib/parliament/request/base_request.rb', line 57

def initialize(base_url: nil, headers: nil, builder: nil, decorators: nil)
  @base_url = base_url || self.class.base_url
  @headers = headers || self.class.headers || {}
  @builder = builder || Parliament::Builder::BaseResponseBuilder
  @decorators = decorators
  @query_params = {}
end

Class Attribute Details

.base_urlObject

Since:

  • 0.7.5



165
166
167
# File 'lib/parliament/request/base_request.rb', line 165

def base_url
  @base_url
end

.headersObject

Since:

  • 0.7.5



165
166
167
# File 'lib/parliament/request/base_request.rb', line 165

def headers
  @headers
end

Instance Attribute Details

#base_urlString (readonly)

the base url of our api. (expected: example.com - without the trailing slash).

Returns:

  • (String)

    the current value of base_url

Since:

  • 0.7.5



9
10
11
# File 'lib/parliament/request/base_request.rb', line 9

def base_url
  @base_url
end

#headersHash (readonly)

the headers being sent in the request.

Returns:

  • (Hash)

    the current value of headers

Since:

  • 0.7.5



9
10
11
# File 'lib/parliament/request/base_request.rb', line 9

def headers
  @headers
end

#query_paramsObject (readonly)

Since:

  • 0.7.5



10
11
12
# File 'lib/parliament/request/base_request.rb', line 10

def query_params
  @query_params
end

Instance Method Details

#get(params: nil) ⇒ Parliament::Response::BaseResponse

Makes an HTTP GET request and process results into a response.

Examples:

HTTP GET request

request = Parliament::Request::BaseRequest.new(base_url: 'http://example.com/people/123'

# url: http://example.com/people/123

response = request.get #=> #<Parliament::Response::BaseResponse ...>

HTTP GET request with URI encoded form values

request = Parliament::Request.new(base_url: 'http://example.com/people/current')

# url: http://example.com/people/current?limit=10&page=4&lang=en-gb

response = request.get({ limit: 10, page: 4, lang: 'en-gb' }) #=> #<Parliament::Response::BaseResponse ...>

Parameters:

  • params (Hash) (defaults to: nil)

    (optional) additional URI encoded form values to be added to the URI.

Returns:

Raises:

Since:

  • 0.7.5



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/parliament/request/base_request.rb', line 88

def get(params: nil)
  @query_params = @query_params.merge(params) unless params.nil?

  endpoint_uri = URI.parse(query_url)
  endpoint_uri.query = URI.encode_www_form(@query_params.to_a) unless @query_params.empty?

  http = Net::HTTP.new(endpoint_uri.host, endpoint_uri.port)
  http.use_ssl = true if endpoint_uri.scheme == 'https'

  net_response = http.start do |h|
    api_request = Net::HTTP::Get.new(endpoint_uri.request_uri)
    add_headers(api_request)

    h.request api_request
  end

  handle_errors(net_response)

  build_response(net_response)
end

#post(params: nil, body: nil, timeout: 60) ⇒ Parliament::Response::BaseResponse

Makes an HTTP POST request and process results into a response.

Examples:

HTTP POST request

request = Parliament::Request::BaseRequest.new(base_url: 'http://example.com/people/123', headers: {'Content': 'application/json', 'Accept': 'application/json'})

# url: http://example.com/people/123

response = request.post(body: {}.to_json) #=> #<Parliament::Response::BaseResponse ...>

HTTP POST request with URI encoded form values

request = Parliament::Request::BaseRequest.new(base_url: 'http://example.com/people/current', headers: {'Content': 'application/json', 'Accept': 'application/json'})

# url: http://example.com/people/current?limit=10&page=4&lang=en-gb

response = request.post({ limit: 10, page: 4, lang: 'en-gb' }, body: {}.to_json) #=> #<Parliament::Response::BaseResponse ...>

Parameters:

  • params (Hash) (defaults to: nil)

    (optional) additional URI encoded form values to be added to the URI.

  • body (String) (defaults to: nil)

    (optional) body of the post request.

  • timeout (Integer) (defaults to: 60)

    (optional) a Net::HTTP.read_timeout value passed suring the post.

Returns:

Raises:

Since:

  • 0.7.5



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/parliament/request/base_request.rb', line 134

def post(params: nil, body: nil, timeout: 60)
  @query_params = @query_params.merge(params) unless params.nil?

  endpoint_uri = URI.parse(query_url)
  endpoint_uri.query = URI.encode_www_form(@query_params.to_a) unless @query_params.empty?

  http = Net::HTTP.new(endpoint_uri.host, endpoint_uri.port)
  http.use_ssl = true if endpoint_uri.scheme == 'https'
  http.read_timeout = timeout

  request = Net::HTTP::Post.new(
    endpoint_uri.request_uri,
    'Content-Type' => 'application/json'
  )

  add_headers(request)

  request.body = body unless body.nil?

  net_response = http.request(request)

  handle_errors(net_response)

  build_response(net_response)
end