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