ActiveResource要求に対するHTTP応答を表示するにはどうすればよいですか?
-
03-07-2019 - |
質問
機能していない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サイトツールを使用できます。