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

Constant Summary collapse

TIMEOUT =

Since:

  • 0.7.5

40.freeze
CONNECTTIMEOUT =

Since:

  • 0.7.5

5.freeze

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 setting 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:

  • (defaults to: nil)

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

  • (defaults to: nil)

    the headers being sent in the request.

  • (defaults to: nil)

    the builder to use in order to build a response.

  • (defaults to: nil)

    the decorator modules to use in order to provide possible alias methods for any objects created by the builder.

Since:

  • 0.7.5



63
64
65
66
67
68
69
# File 'lib/parliament/request/base_request.rb', line 63

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



172
173
174
# File 'lib/parliament/request/base_request.rb', line 172

def base_url
  @base_url
end

.headersObject

Since:

  • 0.7.5



172
173
174
# File 'lib/parliament/request/base_request.rb', line 172

def headers
  @headers
end

Instance Attribute Details

#base_urlString (readonly)

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

Returns:

  • the current value of base_url

Since:

  • 0.7.5



12
13
14
# File 'lib/parliament/request/base_request.rb', line 12

def base_url
  @base_url
end

#query_paramsHash (readonly)

any query parameters to be sent in the request.

Returns:

  • the current value of query_params

Since:

  • 0.7.5



12
13
14
# File 'lib/parliament/request/base_request.rb', line 12

def query_params
  @query_params
end

Instance Method Details

#get(params: nil, timeout: TIMEOUT, connecttimeout: CONNECTTIMEOUT) ⇒ 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:

  • (defaults to: nil)

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

  • (defaults to: TIMEOUT)

    (optional) time limit for the entire request in seconds.

  • (defaults to: CONNECTTIMEOUT)

    (optional) time limit for just the connection in seconds.

Returns:

  • a Parliament::Response::BaseResponse object containing all of the data returned from the URL.

Raises:

  • when the server responds with a 5xx status code.

  • when the server responds with a 4xx status code.

  • when the response body is empty.

Since:

  • 0.7.5



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/parliament/request/base_request.rb', line 96

def get(params: nil, timeout: TIMEOUT, connecttimeout: CONNECTTIMEOUT)
  Typhoeus::Config.user_agent = 'Ruby'

  uri_hash = separate_uri(query_url, @query_params, params)

  typhoeus_request = Typhoeus::Request.new(
    uri_hash[:endpoint],
    method:          :get,
    params:          uri_hash[:params],
    headers:         headers,
    timeout:         timeout,
    connecttimeout:  connecttimeout,
    accept_encoding: 'gzip'
  )

  response = typhoeus_request.run

  handle_errors(response)

  build_response(response)
end

#post(params: nil, body: nil, timeout: TIMEOUT, connecttimeout: CONNECTTIMEOUT) ⇒ 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:

  • (defaults to: nil)

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

  • (defaults to: nil)

    (optional) body of the post request.

  • (defaults to: TIMEOUT)

    (optional) time limit for the entire request in seconds.

  • (defaults to: CONNECTTIMEOUT)

    (optional) time limit for just the connection in seconds.

Returns:

  • a Parliament::Response::BaseResponse object containing all of the data returned from the URL.

Raises:

  • when the server responds with a 5xx status code.

  • when the server responds with a 4xx status code.

  • when the response body is empty.

Since:

  • 0.7.5



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/parliament/request/base_request.rb', line 144

def post(params: nil, body: nil, timeout: TIMEOUT, connecttimeout: CONNECTTIMEOUT)
  Typhoeus::Config.user_agent = 'Ruby'

  uri_hash = separate_uri(query_url, @query_params, params)

  typhoeus_request = Typhoeus::Request.new(
    uri_hash[:endpoint],
    method:          :post,
    params:          uri_hash[:params],
    headers:         headers.merge({ 'Content-Type' => 'application/json' }),
    accept_encoding: 'gzip',
    timeout:         timeout,
    connecttimeout:  connecttimeout,
    body:            body
  )

  response = typhoeus_request.run

  handle_errors(response)

  build_response(response)
end