Ответ 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>