ActiveResource要求に対するHTTP応答を表示するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/227907

質問

機能していないActiveResource呼び出しをデバッグしようとしています。

ActiveResourceが行っているリクエストに対するHTTPレスポンスを表示する最良の方法は何ですか?

役に立ちましたか?

解決

簡単です。戻ってくる応答を見てください。 :)

2つのオプション:

  • コンピューターにソースファイルがあります。編集してください。適切な場所に puts response.inspect を配置します。忘れずに削除してください。
  • Rubyにはオープンクラスがあります。適切なメソッドを見つけて、それを再定義して希望どおりに実行するか、エイリアスと呼び出しチェーンを使用してこれを実行します。おそらく、応答を返すメソッドがあります。それを取得し、印刷してから返します。

これは後者のオプションの馬鹿げた例です。

# Somewhere buried in ActiveResource:
class Network
  def get
    return get_request
  end

  def get_request
    "I'm a request!"
  end
end

# Somewhere in your source files:
class Network
  def print_request
    request = old_get_request
    puts request
    request
  end
  alias :old_get_request :get_request
  alias :get_request :print_request
end

最初のクラス定義がActiveRecordソースファイルにあるとします。 2番目のクラス定義は、アプリケーションのどこかにあります。

$ irb -r openclasses.rb 
>> Network.new.get
I'm a request!
=> "I'm a request!"

印刷してから返すことがわかります。きちんとしているのですか?

(Railsを使用していないため、私の簡単な例では使用していませんが、 alias_method_chain をチェックしてエイリアス呼び出しを組み合わせてください。)

他のヒント

Monkeyは、Net :: HTTPデバッグモードを有効にするために接続にパッチを適用します。 https://gist.github.com/591601 を参照してください-この問題を正確に解決するために書きました。この要点をRailsアプリに追加すると、デバッグ情報の印刷に使用できる Net :: HTTP.enable_debug!および Net :: HTTP.disable_debug!が提供されます。 p>

Net :: HTTPデバッグモードは安全ではないため、本番環境では使用しないでください。デバッグには非常に役立ちます。

'debug_connection.rb' という名前の新しいファイルを config / initializers / に追加し、次の内容を追加します。

class ActiveResource::Connection
  # Creates new Net::HTTP instance for communication with
  # remote service and resources.
  def http
    http = Net::HTTP.new(@site.host, @site.port)
    http.use_ssl = @site.is_a?(URI::HTTPS)
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE if http.use_ssl
    http.read_timeout = @timeout if @timeout
    # Here's the addition that allows you to see the output
    http.set_debug_output $stderr
    return http
  end
end

これにより、ネットワークトラフィック全体が$ stderrに出力されます。

Wireshark が好きです。これは、Webブラウザクライアント側(通常は開発マシン)でリッスンを開始できるためです。 )その後、ページ要求を行います。次に、HTTPパケットを見つけ、右クリックして[会話をフォロー]を選択します。ヘッダーが行き来するHTTPを確認します。

これは、サーバーも制御している場合にのみ機能します:

サーバーログを追跡し、呼び出されたURLをフィッシングアウトします。

Completed in 0.26889 (3 reqs/sec) | Rendering: 0.00036 (0%) | DB: 0.02424 (9%) | 200 OK [http://localhost/notifications/summary.xml?person_id=25738]

それをFirefoxで開きます。サーバーが真にRESTful(つまり、ステートレス)である場合、AResと同じ応答が返されます。

または、正確な内部構造がわからないときに物事に取り組む私の方法は、文字通り「デバッガ」をスローすることです。ステートメント、" script / server --debugger"を使用してサーバーを起動します。そして、目的の場所に来るまでコードをステップ実行し、IRBでその場で検査を開始します。

おそらく最良の方法は、トラフィックスニファーを使用することです。

(これは完全に機能します...私の場合は見たいトラフィックは暗号化されています。D'oh!)

ここで TCPFlow を使用して、回線を通過するトラフィックを監視し、アプリにパッチを適用して出力するのではなく。

Firefoxプラグインのライブhttpヘッダー( http://livehttpheaders.mozdev.org/ )は素晴らしいこのため。または、 http://www.httpviewer.net/

のようなWebサイトツールを使用できます。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top