lib/flexirest/request.rb in flexirest-1.3.35 vs lib/flexirest/request.rb in flexirest-1.4.0

- old
+ new

@@ -5,10 +5,11 @@ module Flexirest class Request include AttributeParsing + include JsonAPIProxy attr_accessor :post_params, :get_params, :url, :path, :headers, :method, :object, :body, :forced_url, :original_url def initialize(method, object, params = {}) @method = method @method[:options] ||= {} @@ -104,10 +105,12 @@ end def request_body_type if @method[:options][:request_body_type] @method[:options][:request_body_type] + elsif @object.nil? + nil elsif object_is_class? @object.request_body_type else @object.class.request_body_type end @@ -178,11 +181,11 @@ etag = cached.etag end end response = ( - if proxy + if proxy && proxy.is_a?(Class) proxy.handle(self) do |request| request.do_request(etag) end else do_request(etag) @@ -226,10 +229,16 @@ params = @params || @object._attributes rescue {} if params.is_a?(String) || params.is_a?(Integer) params = {id:params} end + # Format includes parameter for jsonapi + if proxy == :json_api + JsonAPIProxy::Request::Params.translate(params, @object._include_associations) + @object._reset_include_associations! + end + if @method[:options][:defaults].respond_to?(:call) default_params = @method[:options][:defaults].call(params) else default_params = @method[:options][:defaults] || {} end @@ -321,11 +330,21 @@ end end end def prepare_request_body(params = nil) - if http_method == :get + if proxy == :json_api + if http_method == :get || http_method == :delete + @body = "" + else + headers["Content-Type"] ||= "application/vnd.api+json" + @body = JsonAPIProxy::Request::Params.create(params || @post_params || {}, @object).to_json + end + + headers["Accept"] ||= "application/vnd.api+json" + JsonAPIProxy::Headers.save(headers) + elsif http_method == :get @body = "" elsif request_body_type == :form_encoded @body ||= (params || @post_params || {}).to_query headers["Content-Type"] ||= "application/x-www-form-urlencoded" elsif request_body_type == :json @@ -473,11 +492,10 @@ raise HTTPServerException.new(status:status, result:error_response, raw_response: @response.body, url:@url, method: http_method) elsif status == 0 raise TimeoutException.new("Timed out getting #{response.url}") end end - result end def new_object(attributes, name = nil) @method[:options][:has_many] ||= {} @@ -598,21 +616,29 @@ def is_json_response? @response.response_headers['Content-Type'].nil? || @response.response_headers['Content-Type'].include?('json') end + def is_json_api_response? + @response.response_headers['Content-Type'] && @response.response_headers['Content-Type'].include?('application/vnd.api+json') + end + def is_xml_response? @response.response_headers['Content-Type'].include?('xml') end def generate_new_object(options={}) if @response.body.is_a?(Array) || @response.body.is_a?(Hash) body = @response.body elsif is_json_response? begin body = @response.body.blank? ? {} : MultiJson.load(@response.body) - rescue MultiJson::ParseError => exception + rescue MultiJson::ParseError raise ResponseParseException.new(status:@response.status, body:@response.body, headers:@response.headers) + end + + if is_json_api_response? + body = JsonAPIProxy::Response.parse(body, @object) end if options[:ignore_root] body = body[options[:ignore_root].to_s] end