使用net :: http从请求对象获取URL

时间:2013-11-21 15:28:30

标签: ruby ruby-on-rails-3 ruby-on-rails-3.2

我正在创建一个请求对象(my_request)并从中获取响应。

  if params[:method].upcase == 'GET'
    my_request = Net::HTTP::Get.new('/' + params[:url]) 
  elsif params[:method].upcase == 'POST'
    my_request = Net::HTTP::Post.new('/' + params[:url]) 
  elsif params[:method].upcase == 'PUT'
    my_request = Net::HTTP::Put.new('/' + params[:url]) 
  elsif params[:method].upcase == 'DELETE'
    my_request = Net::HTTP::Delete.new('/' + params[:url]) 
  end

  response = http.request(my_request)

我想获取my_request将发出请求的确切网址。我试过'fullpath'和original_url,但它们都没有用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Net::HTTP个类没有fullpathoriginal_url方法或等效方法。它们继承自Net::HTTP::GenericRequest,没有这种方法。

相反,您应该使用path方法。 Net::HTTP次请求不会存储主机名,因此如果您要发出有效请求,则需要包含完整的主机名,而不仅仅是路径。

实施例

# Good: complete path
request = Net::HTTP::Get.new('http://example.com/about')
request.path # => 'http://example.com/about'
http.request(request) # => Success

# Bad: incomplete path
request = Net::HTTP::Get.new('/about')
request.path # => '/about'
http.request(request) # => Error

另外,如果它是我的,我会重构你的代码看起来更像这样:

url = "http://hostname.com/" + params[:url]
request = case params[:method].upcase
          when 'GET'    then Net::HTTP::Get.new(url)
          when 'POST'   then Net::HTTP::Post.new(url)
          when 'PUT'    then Net::HTTP::Put.new(url)
          when 'DELETE' then Net::HTTP::Delete.new(url)
          end

http.request(request)