nexar
nexar

Reputation: 11336

Accessing Headers for Net::HTTP::Post in ruby

I have the following bit of code:

    uri = URI.parse("https://rs.xxx-travel.com/wbsapi/RequestListenerServlet")
    https = Net::HTTP.new(uri.host,uri.port)
    https.use_ssl = true
    req = Net::HTTP::Post.new(uri.path)
    req.body = searchxml
    req["Accept-Encoding"] ='gzip'
    res = https.request(req)

This normally works fine but the server at the other side is complaining about something in my XML and the techies there need the xml message AND the headers that are being sent.

I've got the xml message, but I can't work out how to get at the Headers that are being sent with the above.

Upvotes: 11

Views: 11301

Answers (3)

Swanand
Swanand

Reputation: 12426

To access headers use the each_header method:

# Header being sent (the request object):
req.each_header do |header_name, header_value|
  puts "#{header_name} : #{header_value}"
end

# Works with the response object as well:
res.each_header do |header_name, header_value|
  puts "#{header_name} : #{header_value}"
end

Upvotes: 14

the Tin Man
the Tin Man

Reputation: 160631

Take a look at the docs for Net::HTTP's post method. It takes the path of the uri value, the data (XML) you want to post, then the headers you want to set. It returns the response and the body as a two-element array.

I can't test this because you've obscured the host, and odds are good it takes a registered account, but the code looks correct from what I remember when using Net::HTTP.

require 'net/http'
require 'uri'

uri = URI.parse("https://rs.xxx-travel.com/wbsapi/RequestListenerServlet")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
req, body = https.post(uri.path, '<xml><blah></blah></xml>', {"Accept-Encoding" => 'gzip'})
puts "#{body.size} bytes received."
req.each{ |h,v| puts "#{h}: #{v}" }

Look at Typhoeus as an alternate, and, in my opinion, easier to use gem, especially the "Making Quick Requests" section.

Upvotes: 2

ALoR
ALoR

Reputation: 4914

you can add:

https.set_debug_output $stderr

before the request and you will see in console the real http request sent to the server.
very useful to debug this kind of scenarios.

Upvotes: 13

Related Questions