Rubyでnet/http(Net::HTTP)を使う駄目コードを書いてたので直した

Ruby の net/http(Net::HTTP) ライブラリを使って、Web API 経由の json 形式レスポンスを取得するコードを書いていたのですが、ちょっとまずい書き方をしていました。エラー処理をしっかりするように修正を行いましたのでその記録。

スポンサーリンク

最初に書いてた net/http を使う駄目コード

最初に書いてた駄目コードは次のもの。Rails プロジェクトで lib 以下に作成していた自作モジュールです。

いやーこれね、駄目ですこのコード。SomeModule の get_sample_data メソッドの中で、Net::HTTP.get(uri) で uri を open して、中身の json を get するとこまで一気にやろうとしていたのですが、アクセス先サーバーが落ちてたりすると uri が開けずに例外発生。Rails の場合、500エラーを返します。

ということで、アクセス先の url が開けなかった時や、url 先がリダイレクトを繰り返していたり、Timeout になった時などのエラーハンドリングを行うように書き直しました。ほぼ以下ページの「RedirectとかTimeoutとかエラー処理とかちゃんとやりたい時用」を参考。

RubyでJSON形式の結果が返ってくるURLをParseする – Qiita

助かりました、ありがとうございます。

修正した net/http を使うコード

今回の場合 Rails プロジェクトなので、lib 以下に Web API 経由で json を get するヘルパー用のモジュールを追加しました。

lib/api_helper.rb

エラーの場合は、nil を返すようにした。

続いて、この ApiHelper#get_json メソッドを使う側、冒頭の SomeModule#get_sample_data メソッドを以下のように変更。

これでエラー処理が上手くできるようになったはず。

net/http 関連で他に参考にしたページ

以下ページも大変参考になりました。

Rubyist Magazine – 標準添付ライブラリ紹介 【第 7 回】 net/http

上記るびまの記事は Net::HTTP を理解するのにとても役立ちます。Net::HTTPResponse のクラス階層が分かりやすく解説してあり、先の get_json メソッドで case response ~ と書ける理由も理解できました。Ruby の case ~ when は、=== (is_a?, kind_of?) を使ってオブジェクトの真偽を判定するのですよね。

instance method Object#===
=== (Module) – Rubyリファレンス

irb で試したところ、以下のようになります。

URL をオープンするような処理では、例外のハンドリングをしっかりしておかないといけませんね。昨今のアプリケーションだと、web 経由の API を使う場面なども多いと思いますし。以上自分の書いた駄目コードを修正したエントリーでした!

スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!