2016-07-30 1 views
0

http 요청을 사용자 지정 기록하려고합니다. 아이디어는 요청이 기록되는 기능을 정의하는 것입니다.Ruby : 사용자 지정 메서드 내에서 HTTP 요청 기록

recorded :get, :post, :patch, :delete do 
    Net::HTTP.get(URI('http://www.google.com')) #will log 
end 

Net::HTTP.get(URI('http://news.ycombinator.com')) # will not log 

문제는 내가 Net::HTTP 클래스 내부 alias_method에 필요하고 방법 내부 클래스를 정의하는 것은 허용되지 않는다는 점이다.

다음은 메소드 정의입니다.

require 'net/http' 

def recorded(*methods, &block) 
    # module Net 
    # class HTTP 
    #  alias_method(:orig_request, :request) unless method_defined?(:orig_request) 
    #  alias_method(:orig_connect, :connect) unless method_defined?(:orig_connect) 
    # 
    #  def request(req, body = nil, &block) 
    #  if started? 
    #   puts :started 
    #  end 
    # 
    #  @response = orig_request(req, body, &block) 
    #  puts @response.code 
    #  # LOGGING HERE THE REQUEST 
    # 
    #  @response 
    #  end 
    # 
    #  def connect 
    #  orig_connect 
    #  end 
    # end 
    # end 

    yield block 
end 

답변

0

이 특정한 문제가 극복해야하지만 언급 한 질문에 대답 같이 바로이 방법으로 다른 많은 문제를 경험하게 될 것입니다 :

Net::HTTP.alias_method(:orig_request, :request) 

: alias_method 것은 단지 클래스 메소드입니다 위는 완벽하게 작동합니다. 그러나 당신의 코드는 결코 "dealiases"을 되돌려 놓지 않습니다 (원래의 방법을 되 돌리십시오). 그러므로 Net::HTTP#request에 대한 모든 후속 호출은 을 별칭의 버전으로 호출합니다.

이렇게하려면 인스턴스 변수를 Net::HTTP 등으로 설정하거나 상태를 유지하고 별칭이 지정된 메소드 또는 원래의 메소드로 라우팅 할 수 있습니다.

사이드 노트 : Ruby2는이 용도로 사용하기 위해 Module#prepend을 사용하고 있기 때문에 이러한 별칭 접근법을 사용하는 것이 기존과 유사합니다.

관련 문제