class LittleMonster::Core::API
Public Class Methods
delete(path, params = {}, options = {})
click to toggle source
# File lib/little_monster/core/api.rb, line 26 def delete(path, params = {}, options = {}) request :delete, path, params, options end
get(path, params = {}, options = {})
click to toggle source
# File lib/little_monster/core/api.rb, line 10 def get(path, params = {}, options = {}) request :get, path, params, options end
patch(path, params = {}, options = {})
click to toggle source
# File lib/little_monster/core/api.rb, line 22 def patch(path, params = {}, options = {}) request :patch, path, params, options end
post(path, params = {}, options = {})
click to toggle source
# File lib/little_monster/core/api.rb, line 14 def post(path, params = {}, options = {}) request :post, path, params, options end
put(path, params = {}, options = {})
click to toggle source
# File lib/little_monster/core/api.rb, line 18 def put(path, params = {}, options = {}) request :put, path, params, options end
request(method, path, params = {}, retries: LittleMonster.default_request_retries, retry_wait: LittleMonster.default_request_retry_wait, critical: false)
click to toggle source
# File lib/little_monster/core/api.rb, line 30 def request(method, path, params = {}, retries: LittleMonster.default_request_retries, retry_wait: LittleMonster.default_request_retry_wait, critical: false) request_id = SecureRandom.uuid ret = 0 res = nil url = [LittleMonster.api_url.chomp('/'), path.sub(/\//, '')].join '/' params[:body] = MultiJson.dump params.fetch(:body, {}) unless params[:body].is_a? String params[:headers] ||= {} params[:headers]['Content-Type'] = 'application/json' unless params[:headers]['Content-Type'] params[:headers]['X-Request-ID'] = request_id params[:timeout] = LittleMonster.request_timeout begin res = Typhoeus.public_send method, url, params if res.code >= 500 || res.code.zero? raise FuryHttpApiError, "[type:request_failed][request_id:#{request_id}] request to #{res.effective_url} failed with status #{res.code} retry #{ret}" end logger.info "[type:request_log][request_id:#{request_id}] request made to #{url} with [status:#{res.code}]" rescue StandardError => e logger.error e.message if ret < retries sleep(retry_wait) ret += 1 retry end logger.error "[type:request_max_retries_reached][request_id:#{request_id}][url:#{url}][retries:#{ret}] request has reached max retries" if critical logger.error "[type:critical_request_failed][request_id:#{request_id}][url:#{url}][retries:#{ret}] request has reached max retries" raise APIUnreachableError, "[request_id:#{request_id}] critical request to #{url} has fail, check little monster api" end end res.define_singleton_method(:body) do begin MultiJson.load(res.options[:response_body], symbolize_keys: true) rescue res.options[:response_body] end end res end