Class: SendGrid::Client
- Inherits:
-
Object
- Object
- SendGrid::Client
- Defined in:
- lib/ruby_http_client.rb
Overview
A simple REST client.
Instance Attribute Summary collapse
-
#host ⇒ Object
readonly
Returns the value of attribute host.
-
#http ⇒ Object
readonly
Returns the value of attribute http.
-
#request ⇒ Object
readonly
Returns the value of attribute request.
-
#request_headers ⇒ Object
readonly
Returns the value of attribute request_headers.
-
#url_path ⇒ Object
readonly
Returns the value of attribute url_path.
Instance Method Summary collapse
-
#_(name = nil) ⇒ Object
Add variable values to the url.
-
#add_ssl(http) ⇒ Object
Allow for https calls.
-
#add_version(url = nil) ⇒ Object
Add the API version, subclass this function to customize.
-
#build_args(args) ⇒ Object
Set the query params, request headers and request body.
-
#build_http(host, port) ⇒ Object
Build HTTP request object.
-
#build_query_params(url, query_params) ⇒ Object
Add query parameters to the url.
-
#build_request(name, args) ⇒ Object
Build the API request for HTTP::NET.
-
#build_request_headers(request) ⇒ Object
Build the final request headers.
-
#build_url(query_params: nil) ⇒ Object
Build the final url.
-
#initialize(host: nil, request_headers: nil, version: nil, url_path: nil, http_options: {}, proxy_options: {}) ⇒ Client
constructor
-
Args : -
host-> Base URL for the api.
-
-
#make_request(http, request) ⇒ Object
Make the API call and return the response.
-
#method_missing(name, *args, &_block) ⇒ Object
Dynamically add segments to the url, then call a method.
-
#update_headers(request_headers) ⇒ Object
Update the headers for the request.
Constructor Details
#initialize(host: nil, request_headers: nil, version: nil, url_path: nil, http_options: {}, proxy_options: {}) ⇒ Client
-
Args :
-
host-> Base URL for the api. (e.g. api.sendgrid.com) -
request_headers-> A hash of the headers you want applied onall calls -
version-> The version number of the API.Subclass add_version for custom behavior. Or just pass the version as part of the URL (e.g. client._("/v3")) -
url_path-> A list of the url path segments -
proxy_options-> A hash of proxy settings.(e.g. { host: '127.0.0.1', port: 8080 })
-
41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/ruby_http_client.rb', line 41 def initialize(host: nil, request_headers: nil, version: nil, url_path: nil, http_options: {}, proxy_options: {}) # rubocop:disable Metrics/ParameterLists @host = host @request_headers = request_headers || {} @version = version @url_path = url_path || [] @methods = %w[delete get patch post put] @query_params = nil @request_body = nil = = end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &_block) ⇒ Object
Dynamically add segments to the url, then call a method. (e.g. client.name.name.get())
-
Args :
-
The args are autmoatically passed in
-
-
Returns :
-
Client object or Response object
-
rubocop:disable Style/MethodMissingSuper rubocop:disable Style/MissingRespondToMissing
236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/ruby_http_client.rb', line 236 def method_missing(name, *args, &_block) # Capture the version if name.to_s == 'version' @version = args[0] return _ end # We have reached the end of the method chain, make the API call return build_request(name, args) if @methods.include?(name.to_s) # Add a segment to the URL _(name) end |
Instance Attribute Details
#host ⇒ Object (readonly)
Returns the value of attribute host.
28 29 30 |
# File 'lib/ruby_http_client.rb', line 28 def host @host end |
#http ⇒ Object (readonly)
Returns the value of attribute http.
28 29 30 |
# File 'lib/ruby_http_client.rb', line 28 def http @http end |
#request ⇒ Object (readonly)
Returns the value of attribute request.
28 29 30 |
# File 'lib/ruby_http_client.rb', line 28 def request @request end |
#request_headers ⇒ Object (readonly)
Returns the value of attribute request_headers.
28 29 30 |
# File 'lib/ruby_http_client.rb', line 28 def request_headers @request_headers end |
#url_path ⇒ Object (readonly)
Returns the value of attribute url_path.
28 29 30 |
# File 'lib/ruby_http_client.rb', line 28 def url_path @url_path end |
Instance Method Details
#_(name = nil) ⇒ Object
Add variable values to the url. (e.g. /your/api/variable_value/call) Another example: if you have a ruby reserved word, such as true, in your url, you must use this method.
-
Args :
-
name-> Name of the url segment
-
-
Returns :
-
Client object
-
219 220 221 222 223 224 |
# File 'lib/ruby_http_client.rb', line 219 def _(name = nil) url_path = name ? @url_path + [name] : @url_path Client.new(host: @host, request_headers: @request_headers, version: @version, url_path: url_path, http_options: ) end |
#add_ssl(http) ⇒ Object
Allow for https calls
-
Args :
-
http-> HTTP::NET object
-
-
Returns :
-
HTTP::NET object
-
201 202 203 204 205 206 207 |
# File 'lib/ruby_http_client.rb', line 201 def add_ssl(http) if host.start_with?('https') http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER end http end |
#add_version(url = nil) ⇒ Object
Add the API version, subclass this function to customize
-
Args :
-
url-> An empty url string
-
-
Returns :
-
The url string with the version pre-pended
-
83 84 85 86 |
# File 'lib/ruby_http_client.rb', line 83 def add_version(url = nil) path = @version ? "/#{@version}" : '' url.concat(path) end |
#build_args(args) ⇒ Object
Set the query params, request headers and request body
-
Args :
-
args-> array of args obtained from method_missing
-
106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/ruby_http_client.rb', line 106 def build_args(args) args.each do |arg| arg.each do |key, value| case key.to_s when 'query_params' @query_params = value when 'request_headers' update_headers(value) when 'request_body' @request_body = value end end end end |
#build_http(host, port) ⇒ Object
Build HTTP request object
-
Returns :
-
Request object
-
188 189 190 191 192 |
# File 'lib/ruby_http_client.rb', line 188 def build_http(host, port) params = [host, port] params += .values_at(:host, :port, :user, :pass) unless .empty? add_ssl(Net::HTTP.new(*params)) end |
#build_query_params(url, query_params) ⇒ Object
Add query parameters to the url
-
Args :
-
url-> path to endpoint -
query_params-> hash of query parameters
-
-
Returns :
-
The url string with the query parameters appended
-
96 97 98 99 |
# File 'lib/ruby_http_client.rb', line 96 def build_query_params(url, query_params) params = URI.encode_www_form(query_params) url.concat("?#{params}") end |
#build_request(name, args) ⇒ Object
Build the API request for HTTP::NET
-
Args :
-
name-> method name, received from method_missing -
args-> args passed to the method
-
-
Returns :
-
A Response object from make_request
-
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/ruby_http_client.rb', line 142 def build_request(name, args) build_args(args) if args uri = build_url(query_params: @query_params) @http = build_http(uri.host, uri.port) net_http = Kernel.const_get('Net::HTTP::' + name.to_s.capitalize) @request = build_request_headers(net_http.new(uri.request_uri)) if @request_body && (!@request_headers.key?('Content-Type') || @request_headers['Content-Type'] == 'application/json') # If body is a hash, encode it; else leave it alone @request.body = if @request_body.class == Hash @request_body.to_json else @request_body end @request['Content-Type'] = 'application/json' elsif !@request_body && (name.to_s == 'post') @request['Content-Type'] = '' else @request.body = @request_body end .each do |attribute, value| @http.send("#{attribute}=", value) end make_request(@http, @request) end |
#build_request_headers(request) ⇒ Object
Build the final request headers
-
Args :
-
request-> HTTP::NET request object
-
-
Returns :
-
HTTP::NET request object
-
69 70 71 72 73 74 |
# File 'lib/ruby_http_client.rb', line 69 def build_request_headers(request) @request_headers.each do |key, value| request[key] = value end request end |
#build_url(query_params: nil) ⇒ Object
Build the final url
-
Args :
-
query_params-> A hash of query parameters
-
-
Returns :
-
The final url string
-
128 129 130 131 132 |
# File 'lib/ruby_http_client.rb', line 128 def build_url(query_params: nil) url = [add_version(''), *@url_path].join('/') url = build_query_params(url, query_params) if query_params URI.parse("#{@host}#{url}") end |
#make_request(http, request) ⇒ Object
Make the API call and return the response. This is separated into it’s own function, so we can mock it easily for testing.
-
Args :
-
http-> NET:HTTP request object -
request-> NET::HTTP request object
-
-
Returns :
-
Response object
-
179 180 181 182 |
# File 'lib/ruby_http_client.rb', line 179 def make_request(http, request) response = http.request(request) Response.new(response) end |
#update_headers(request_headers) ⇒ Object
Update the headers for the request
-
Args :
-
request_headers-> Hash of request header key/values
-
58 59 60 |
# File 'lib/ruby_http_client.rb', line 58 def update_headers(request_headers) @request_headers.merge!(request_headers) end |