2011-07-27 35 views
12

¿Cómo puedo enviar la solicitud HTTP GET con los parámetros a través de ruby?HTTP de Ruby obtener con los parámetros

He intentado muchos ejemplos pero todos han fallado.

+2

¿Puedes publicar algo que ya tengas? –

+0

¿Qué quieres hacer con esta solicitud? ¿quieres obtener la respuesta? –

+3

¿Has mirado los documentos 'net/http'? Si es así, ¿qué aún no está claro? –

Respuesta

6

Supongo que entiende los ejemplos en el Net::HTTP documentation page pero no sabe cómo pasar los parámetros a la solicitud GET.

Sólo anexar los parámetros a la dirección solicitada, exactamente de la misma manera que escriba dicha dirección en el navegador:

require 'net/http' 

res = Net::HTTP.start('localhost', 3000) do |http| 
    http.get('/users?id=1') 
end 
puts res.body 

Si necesita alguna manera genérica para construir la cadena de parámetros de una matriz asociativa, puede crear un ayudante de la siguiente manera:

require 'cgi' 

def path_with_params(page, params) 
    return page if params.empty? 
    page + "?" + params.map {|k,v| CGI.escape(k.to_s)+'='+CGI.escape(v.to_s) }.join("&") 
end 

path_with_params("/users", :id => 1, :name => "John&Sons") 
# => "/users?name=John%26Sons&id=1" 
14

sé que este post es antiguo, pero por el bien de los que fueron traídos por google, hay una manera más fácil de codificar sus parámetros de una manera segura URL. No estoy seguro de por qué no he visto esto en otro lugar, ya que el método está documentado en la página Net :: HTTP. He visto el método descrito por Arsen7 como la respuesta aceptada en varias otras preguntas también.

mencionado en la documentación Net::HTTP es URI.encode_www_form(params):

# Lets say we have a path and params that look like this: 
path = "/search" 
params = {q: => "answer"} 

# Example 1: Replacing the #path_with_params method from Arsen7 
def path_with_params(path, params) 
    encoded_params = URI.encode_www_form(params) 
    [path, encoded_params].join("?") 
end 

# Example 2: A shortcut for the entire example by Arsen7 
uri = URI.parse("http://localhost.com" + path) 
uri.query = URI.encode_www_form(params) 
response = Net::HTTP.get_response(uri) 

los que el ejemplo que usted elija es muy dependiente de su caso de uso. En mi proyecto actual estoy usando un método similar al recomendado por Arsen7 junto con el método más simple #path_with_params y sin el formato de bloque.

# Simplified example implementation without response 
# decoding or error handling. 

require "net/http" 
require "uri" 

class Connection 
    VERB_MAP = { 
    :get => Net::HTTP::Get, 
    :post => Net::HTTP::Post, 
    :put => Net::HTTP::Put, 
    :delete => Net::HTTP::Delete 
    } 

    API_ENDPOINT = "http://dev.random.com" 

    attr_reader :http 

    def initialize(endpoint = API_ENDPOINT) 
    uri = URI.parse(endpoint) 
    @http = Net::HTTP.new(uri.host, uri.port) 
    end 

    def request(method, path, params) 
    case method 
    when :get 
     full_path = path_with_params(path, params) 
     request = VERB_MAP[method].new(full_path) 
    else 
     request = VERB_MAP[method].new(path) 
     request.set_form_data(params) 
    end 

    http.request(request) 
    end 

    private 

    def path_with_params(path, params) 
    encoded_params = URI.encode_www_form(params) 
    [path, encoded_params].join("?") 
    end 

end 

con = Connection.new 
con.request(:post, "/account", {:email => "[email protected]"}) 
=> #<Net::HTTPCreated 201 Created readbody=true> 
Cuestiones relacionadas