class Google::APIClient::Result
This class wraps a result returned by an API
call.
Attributes
@return [Google::APIClient::Request] Original request object
@return [Google::APIClient::Request] Original request object
@return [Faraday::Response] HTTP response
Public Class Methods
Init the result
@param [Google::APIClient::Request] request
The original request
@param [Faraday::Response] response
Raw HTTP Response
# File lib/google/api_client/result.rb, line 30 def initialize(request, response) @request = request @response = response @media_upload = reference if reference.kind_of?(ResumableUpload) end
Public Instance Methods
Return parsed version of the response body.
@!attribute [r] data @return [Object, Hash, String]
Object if body parsable from API schema, Hash if JSON, raw body if unable to parse
# File lib/google/api_client/result.rb, line 137 def data return @data ||= (begin if self.data? media_type = self.media_type data = self.body case media_type when 'application/json' data = MultiJson.load(data) # Strip data wrapper, if present data = data['data'] if data.has_key?('data') else raise ArgumentError, "Content-Type not supported for parsing: #{media_type}" end if @request.api_method && @request.api_method.response_schema # Automatically parse using the schema designated for the # response of this API method. data = @request.api_method.response_schema.new(data) data else # Otherwise, return the raw unparsed value. # This value must be indexable like a Hash. data end end end) end
Check for parsable data in response
@!attribute [r] data? @return [TrueClass, FalseClass]
true if body can be parsed
# File lib/google/api_client/result.rb, line 127 def data? !(self.body.nil? || self.body.empty? || self.media_type != 'application/json') end
Check if request failed
@!attribute [r] error? @return [TrueClass, FalseClass]
true if result of operation is an error
# File lib/google/api_client/result.rb, line 87 def error? return self.response.status >= 400 end
Extracts error messages from the response body
@!attribute [r] error_message
@return [String]
error message, if available
# File lib/google/api_client/result.rb, line 107 def error_message if self.data? if self.data.respond_to?(:error) && self.data.error.respond_to?(:message) # You're going to get a terrible error message if the response isn't # parsed successfully as an error. return self.data.error.message elsif self.data['error'] && self.data['error']['message'] return self.data['error']['message'] end end return self.body end
Get the content type of the response @!attribute [r] media_type
@return [String]
Value of content-type header
# File lib/google/api_client/result.rb, line 70 def media_type _, content_type = self.headers.detect do |h, v| h.downcase == 'Content-Type'.downcase end if content_type return content_type[/^([^;]*);?.*$/, 1].strip.downcase else return nil end end
Build a request for fetching the next page of data
@return [Google::APIClient::Request]
API request for retrieving next page, nil if no page token available
# File lib/google/api_client/result.rb, line 186 def next_page return nil unless self.next_page_token merged_parameters = Hash[self.reference.parameters].merge({ self.page_token_param => self.next_page_token }) # Because Requests can be coerced to Hashes, we can merge them, # preserving all context except the API method parameters that we're # using for pagination. return Google::APIClient::Request.new( Hash[self.reference].merge(:parameters => merged_parameters) ) end
Get the token used for requesting the next page of data
@!attribute [r] next_page_token
@return [String]
next page token
# File lib/google/api_client/result.rb, line 171 def next_page_token if self.data.respond_to?(:next_page_token) return self.data.next_page_token elsif self.data.respond_to?(:[]) return self.data["nextPageToken"] else raise TypeError, "Data object did not respond to #next_page_token." end end
Name of the field that contains the pagination token
@!attribute [r] page_token_param
@return [String]
currently always 'pageToken'
# File lib/google/api_client/result.rb, line 249 def page_token_param return "pageToken" end
Pagination scheme used by this request/response
@!attribute [r] pagination_type
@return [Symbol]
currently always :token
# File lib/google/api_client/result.rb, line 239 def pagination_type return :token end
Build a request for fetching the previous page of data
@return [Google::APIClient::Request]
API request for retrieving previous page, nil if no page token available
# File lib/google/api_client/result.rb, line 220 def prev_page return nil unless self.prev_page_token merged_parameters = Hash[self.reference.parameters].merge({ self.page_token_param => self.prev_page_token }) # Because Requests can be coerced to Hashes, we can merge them, # preserving all context except the API method parameters that we're # using for pagination. return Google::APIClient::Request.new( Hash[self.reference].merge(:parameters => merged_parameters) ) end
Get the token used for requesting the previous page of data
@!attribute [r] prev_page_token
@return [String]
previous page token
# File lib/google/api_client/result.rb, line 205 def prev_page_token if self.data.respond_to?(:prev_page_token) return self.data.prev_page_token elsif self.data.respond_to?(:[]) return self.data["prevPageToken"] else raise TypeError, "Data object did not respond to #next_page_token." end end
@!attribute [r] resumable_upload
@return [Google::APIClient::ResumableUpload] For resuming media uploads
# File lib/google/api_client/result.rb, line 55 def resumable_upload @media_upload ||= ( options = self.reference.to_hash.merge( :uri => self.headers['location'], :media => self.reference.media ) Google::APIClient::ResumableUpload.new(options) ) end
Check if request was successful
@!attribute [r] success? @return [TrueClass, FalseClass]
true if result of operation was successful
# File lib/google/api_client/result.rb, line 97 def success? return !self.error? end