class Itrp::Response
Public Class Methods
# File lib/itrp/client/response.rb, line 3 def initialize(request, response) @request = request @response = response end
Public Instance Methods
retrieve a value from the resource if the JSON value is an Array a array with the value for each resource will be given @param keys: a single key or a key-path separated by comma
# File lib/itrp/client/response.rb, line 65 def[](*keys) values = json.is_a?(Array) ? json : [json] keys.each { |key| values = values.map{ |value| value.is_a?(Hash) ? value[key] : nil} } json.is_a?(Array) ? values : values.first end
# File lib/itrp/client/response.rb, line 17 def body @response.body end
pagination - current page
# File lib/itrp/client/response.rb, line 83 def current_page @current_page ||= @response.header['X-Pagination-Current-Page'].to_i end
true
if the server did not respond at all
# File lib/itrp/client/response.rb, line 52 def empty? @response.body.blank? end
The JSON value, if single resource is queried this is a Hash, if multiple resources where queried it is an Array If the response is not valid?
it is a Hash with 'message' and optionally 'errors'
# File lib/itrp/client/response.rb, line 23 def json return @json if defined?(@json) # no content, no JSON if @response.code.to_s == '204' data = {} elsif @response.body.blank? # no body, no json data = {message: @response.message.blank? ? 'empty body' : @response.message.strip} end begin data ||= JSON.parse(@response.body) rescue ::Exception => e data = { message: "Invalid JSON - #{e.message} for:\n#{@response.body}" } end # indifferent access to hashes data = data.is_a?(Array) ? data.map(&:with_indifferent_access) : data.with_indifferent_access # empty OK response is not seen as an error data = {} if data.is_a?(Hash) && data.size == 1 && data[:message] == 'OK' # prepend HTTP response code to message data[:message] = "#{response.code}: #{data[:message]}" unless @response.is_a?(Net::HTTPSuccess) @json = data end
the error message in case the response is not valid?
# File lib/itrp/client/response.rb, line 47 def message @message ||= json.is_a?(Hash) ? json[:message] : nil end
pagination urls (full paths with server) - relations :first, :prev, :next, :last Link: <api.itrp.com/v1/requests?page=1&per_page=25>; rel=“first”, <api.itrp.com/v1/requests?page=2&per_page=25>; rel=“prev”, etc.
# File lib/itrp/client/response.rb, line 99 def pagination_link(relation) # split on ',' select the [url] in '<[url]>; rel="[relation]"', compact to all url's found (at most one) and take the first (@pagination_links ||= {})[relation] ||= @response.header['Link'] && @response.header['Link'].split(/,\s*<?/).map{ |link| link[/^\s*<?(.*?)>?;\s*rel="#{relation.to_s}"\s*$/, 1] }.compact.first end
pagination urls (relative paths without server) - relations :first, :prev, :next, :last
# File lib/itrp/client/response.rb, line 105 def pagination_relative_link(relation) (@pagination_relative_links ||= {})[relation] ||= pagination_link(relation) && pagination_link(relation)[/^https?:\/\/[^\/]*(.*)/, 1] end
pagination - per page
# File lib/itrp/client/response.rb, line 78 def per_page @per_page ||= @response.header['X-Pagination-Per-Page'].to_i end
# File lib/itrp/client/response.rb, line 8 def request @request end
# File lib/itrp/client/response.rb, line 12 def response @response end
# File lib/itrp/client/response.rb, line 114 def retry_after @current_page ||= @response.header['Retry-After'].to_i end
The nr of resources found
# File lib/itrp/client/response.rb, line 72 def size @size ||= message ? 0 : json.is_a?(Array) ? json.size : 1 end
true
if the response is invalid because of throttling
# File lib/itrp/client/response.rb, line 110 def throttled? !!(@response.code.to_s == '429' || (message && message =~ /Too Many Requests/)) end
# File lib/itrp/client/response.rb, line 118 def to_s valid? ? json.to_s : message end
pagination - total entries
# File lib/itrp/client/response.rb, line 93 def total_entries @total_entries ||= @response.header['X-Pagination-Total-Entries'].to_i end
pagination - total pages
# File lib/itrp/client/response.rb, line 88 def total_pages @total_pages ||= @response.header['X-Pagination-Total-Pages'].to_i end
true
if no 'message' is given (and the JSON could be parsed)
# File lib/itrp/client/response.rb, line 57 def valid? message.nil? end