Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

0 views
Skip to first unread message

David Sainte-claire

unread,
Nov 22, 2009, 6:14:52 PM11/22/09
to
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?
--
Posted via http://www.ruby-forum.com/.

yermej

unread,
Nov 23, 2009, 12:25:50 PM11/23/09
to
On Nov 22, 5:14 pm, David Sainte-claire <dsaintecla...@gmail.com>
wrote:

> 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

0 new messages