Search code examples
ruby-on-railsrubycurb

Using Ruby Curb gem with API token


Brand new to Ruby. I'm referencing the Curb documentation and attempting to submit a request in curl that utilizes a security token. Here are the 3 parts to my header with my traditional request:

  1. My-Security-Token
  2. 1234567890
  3. website.com

How would I structure Curb to submit Name, Value and Comment as seen above?

What I'm starting with:

c = Curl::Easy.new("http://website.com") do |curl| 
  curl.headers["Name"] = "My-Security-Token"
  curl.headers["Value"] = "1234567890"
  curl.headers["Comment"] = "website.com"
  curl.verbose = true
end

c.perform

Solution

  • Here are the 3 parts to my header with my traditional request

    1. My-Security-Token
    2. 1234567890
    3. website.com

    Headers consist of name/value pairs, so your description doesn't make any sense.

    It looks your header name should be:

     My-Security-Token
    

    and it's value should be:

     1234567890
    

    To make a GET request (you didn't mention what type of request you are making) and specify that header, you can do this:

    require 'curb'
    
    http = Curl.get("http://website.com/") do |http| 
      http.headers["My-Security-Token"] = "1234567890"
    end
    
    puts http.body_str[0..249]  #Output the first 250 characters of the response
    

    If you want to use verbose mode, which will display the actual request and response, you can do this:

    require 'curb'
    
    c = Curl::Easy.new("http://www.google.com/") do |curl| 
      curl.headers["My-Security-Token"] = "1234567890"
      curl.verbose = true
    end
    
    c.perform  #Outputs the request and the response
    puts c.body_str[0..249]  #body_str => the body of the response
    

    output:

    * About to connect() to www.google.com port 80 (#0)
    *   Trying 74.125.28.147... * Connected to www.google.com (74.125.28.147) port 80 (#0)
    > GET / HTTP/1.1
    Host: www.google.com
    Accept: */*
    My-Security-Token: 1234567890  #***HERE IS YOUR CUSTOM HEADER****
    
    < HTTP/1.1 200 OK
    < Date: Tue, 03 Mar 2015 00:14:42 GMT
    < Expires: -1
    < Cache-Control: private, max-age=0
    < Content-Type: text/html; charset=ISO-8859-1
    < Set-Cookie: PREF=ID=479a8fa626097193:FF=0:TM=1425341682:LM=1425341682:S=5kflGPOAzEx-uMWb; expires=Thu, 02-Mar-2017 00:14:42 GMT; path=/; domain=.google.com
    < Set-Cookie: NID=67=Eim3D__PFGbpSWdcIH9IPhkuDEVMFjN4ShU9gA6Z_rMryMoI6nv--sIjk_E00_EpMfSe3RkPO5dYjV7yGTXT3oMLX-t7FsrKSJmF7-OffAuLKrr5KfV1IZzL9yaJQKiB; expires=Wed, 02-Sep-2015 00:14:42 GMT; path=/; domain=.google.com; HttpOnly
    < P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
    < Server: gws
    < X-XSS-Protection: 1; mode=block
    < X-Frame-Options: SAMEORIGIN
    < Alternate-Protocol: 80:quic,p=0.08
    < Accept-Ranges: none
    < Vary: Accept-Encoding
    < Transfer-Encoding: chunked
    < 
    * Expire cleared
    * Connection #0 to host www.google.com left intact
    <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en"><head><meta content="Search the world's information, including webpages, images, videos and more. Google has many specia
    

    If you actually want the custom headers to be:

    Name: My-Security-Token
    Value: 1234567890
    Comment: website.com
    

    ...then you can do this:

    require 'curb'
    
    c = Curl::Easy.new("http://www.google.com/") do |curl| 
      curl.headers["Name"] = "My-Security-Token"
      curl.headers["Value"] = "1234567890"
      curl.headers["Comment"] = "website.com"
      curl.verbose = true
    end
    
    c.perform
    puts c.body_str[0..249]
    

    ...which will produce output like this:

    * About to connect() to www.google.com port 80 (#0)
    *   Trying 74.125.28.105... * Connected to www.google.com (74.125.28.105) port 80 (#0)
    > GET / HTTP/1.1
    Host: www.google.com
    Accept: */*
    Name: My-Security-Token   #HERE ARE YOUR HEADERS
    Value: 1234567890         #HERE
    Comment: website.com      #HERE
    ...
    ...
    

    If nothing above does what you want, then instead of describing your request, how about posting your actual "traditional" request? If you don't know how to do that, search google.