Подтвердить что ты не робот

Ruby HTTP get с параметрами

Как отправить HTTP-запрос GET с параметрами через ruby?

Я пробовал много примеров, но все из них не удалось.

4b9b3361

Ответ 1

Я знаю, что этот пост старый, но для тех, кого сюда привнес Google, существует более простой способ кодирования ваших параметров безопасным образом. Я не уверен, почему я не видел этого в другом месте, поскольку метод документирован на странице Net:: HTTP. Я видел метод, описанный Arsen7, как принятый ответ на несколько других вопросов.

Упомянутая в Net:: HTTP документация 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)

Какой пример вы выбираете, очень зависит от вашего варианта использования. В моем текущем проекте я использую метод, аналогичный методу, рекомендованному Arsen7, а также более простой метод #path_with_params и без формата блока.

# 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> 

Ответ 2

Я предполагаю, что вы понимаете примеры на странице Net:: HTTP, но вы не знаете, как передавать параметры в запрос GET.

Вы просто добавляете параметры к запрашиваемому адресу точно так же, как вы вводите такой адрес в браузере:

require 'net/http'

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

Если вам нужен общий способ построения строки параметров из хэша, вы можете создать вспомогательный помощник, например:

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"

Ответ 3

Я предполагаю, что это терпит неудачу из-за других причин, некоторый реальный пример поможет понять проблему. В любом случае вы можете легко отправить запрос на получение параметров с помощью гема nice_http: https://github.com/MarioRuiz/nice_http

require 'nice_http'

http = NiceHttp.new('https://reqres.in')

resp = http.get "/api/users?page=2&other=true&more=Doomi"

pp resp.code
pp resp.data.json