user2369480
user2369480

Reputation: 71

rails api how to fill headers in request

I don't understand what I do wrong. I want to send a simple request to an API, and it didn't work:

    class Paytrace
      require 'rest-client'

      attr_reader :auth_token, :authorize

      def initialize()
        @auth_token = auth_token
      end

      def auth_token
        response = RestClient.post 'https://api.paytrace.com/oauth/token', { grant_type: :password, username: "loginname", password: "htmlkoi8r" }
        puts response
      end

      def authorize
        headers = {:Authorization => "Bearer #{auth_token['access_token']}"}

        response1 = RestClient.get('https://api.paytrace.com/v1/transactions/sale/keyed', headers)

        puts response1
      end
    end

    a = Paytrace.new
    a.authorize

console.log

lucker@lucker-pc:~/git/paytrace-testh$ ruby integration.rb {"access_token":"c6d69786f6075633:8647d6c6b6f6968327:092e8cfc553726d2b8198577ea2836f41173aae68a53aa1d2af2b2c7f65dcdc7","token_type":"Bearer","expires_in":7200,"created_at":1556098344} {"access_token":"c6d69786f6075633:8647d6c6b6f6968327:232c92f977a301d033eec321c3d82b73bb65ebec33f9fcc8f6c2d7575c8b0d88","token_type":"Bearer","expires_in":7200,"created_at":1556098346} Traceback (most recent call last): 1: from integration.rb:25:in <main>' integration.rb:16:inauthorize': undefined method `[]' for nil:NilClass (NoMethodError)

  1. Why is the access_token generated twice?
  2. Why is there an undefined method '[]' for nil:NilClass?

Upvotes: 0

Views: 1287

Answers (2)

Muahmmad Tahir Saleh
Muahmmad Tahir Saleh

Reputation: 64

Seems like there are 3 mistakes in this code the 2 puts. line 12 and 20

and the

headers = {:Authorization => "Bearer #{auth_token['access_token']}"}

should be

headers = {:Authorization => "Bearer #{auth_token[:access_token]}"}

or

headers = {:Authorization => "Bearer #{@auth_token[:access_token]}"}

try this code

    class Paytrace
      require 'rest-client'

      attr_reader :auth_token, :authorize

      def initialize()
        @auth_token = auth_token
      end

      def auth_token
        response = RestClient.post 'https://api.paytrace.com/oauth/token', { grant_type: :password, username: "loginname", password: "htmlkoi8r" }
        # puts response
      end

      def authorize
        headers = {:Authorization => "Bearer #{@auth_token[:access_token]}"}

        response1 = RestClient.get('https://api.paytrace.com/v1/transactions/sale/keyed', headers)

        # puts response1
      end
    end

    a = Paytrace.new
    a.authorize

take care the your response hash if you check is

{:access_token=>"c6d69786f6075633:8647d6c6b6f6968327:092e8cfc553726d2b8198577ea2836f41173aae68a53aa1d2af2b2c7f65dcdc7",
   :token_type=>"Bearer",
   :expires_in=>7200,
   :created_at=>1556098344}

and not

{"access_token":"c6d69786f6075633:8647d6c6b6f6968327:092e8cfc553726d2b8198577ea2836f41173aae68a53aa1d2af2b2c7f65dcdc7","token_type":"Bearer","expires_in":7200,"created_at":1556098344} 

Upvotes: 0

CAmador
CAmador

Reputation: 1951

Your method auth_token is not returning a response, but a nil (puts returns nil).

Btw, you don't need attr_reader :authorize since you have a method with that name.

Also, as you are setting attr_reader :auth_token, the method auth_token must be rename (and maybe become private).

Change your code to:

    class Paytrace
      require 'rest-client'

      attr_reader :auth_token

      def initialize()
        @auth_token = get_auth_token
      end      

      def authorize
        headers = {:Authorization => "Bearer #{auth_token['access_token']}"}

        RestClient.get('https://api.paytrace.com/v1/transactions/sale/keyed', headers)
      end

      private

        def get_auth_token
          RestClient.post 'https://api.paytrace.com/oauth/token', { grant_type: :password, username: "loginname", password: "htmlkoi8r" }        
        end
    end

    a = Paytrace.new
    puts a.auth_token
    puts a.authorize

Upvotes: 1

Related Questions