I can't seem to find an easy way to set Net::HTTP GET params

  • Thread starter David Sainte-claire
  • Start date
D

David Sainte-claire

Hello,

I'm sure this is a newb question, but I've spent the last two hours
trying to figure out how to set the query paramters on an HTTP GET
request.

Right now I am doing something like this:

def call()
Net::HTTP.start(@base_url) do |http|
response = http.get(@uri)
puts "Code = #{response.code}"
puts "Message = #{response.message}"
puts "Body = #{response.body}"
end

It works as long as I include the query parameters as part of the @uri
string, but to me that doesn't seem like an elegant approach.

I could just append the parameters to the end of the URI as part of the
call() method (right now it has no parameters, but I could change it to
something like call(params) which accepts a hash and manually append
them to the URI before calling the GET method.

I'm just hoping that there's an easier, or more standard way of doing
it.

Anyone ever run into something similar and has an elegant solution?
 
Y

yermej

Hello,

I'm sure this is a newb question, but I've spent the last two hours
trying to figure out how to set the query paramters on an HTTP GET
request.

You have a couple options depending on what sort of input you're
dealing with.

uri = URI.parse('http://www.google.com/search?q=hello')
# or: uri = URI::HTTP.build({:host => 'www.google.com', :path => '/
search', :query => 'q=hello'})

Net::HTTP.start(uri.host) do |http|
response = http.get(uri.request_uri)
# ...
end

However, as far as I know, there isn't a method that will do a GET in
a similar way to the POST methods (i.e. you can't pass a hash of name/
value pairs). To make that happen, you'll need another method. Perhaps
something like this:

require 'cgi'
def querify(query_hash)
query_hash.map {|name, value| "#{CGI::escape(name.to_s)}=#
{CGI::escape(value.to_s)}" }.join('&')
end

Then you could do:

uri = URI::HTTP.build({:host => 'www.google.com', :path => '/
search', :query => querify({:q => 'hello'})})

Maybe I'm wrong and there is a better way to do this, but I haven't
seen it in core/standard library. Anybody?

Jeremy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,731
Latest member
MarcyGipso

Latest Threads

Top