やりたいこと
webAPIの基礎を学習したく、郵便番号APIからjsonデータを取得しrubyで住所を表示するプログラムを書く
Qiitaでこちらの非常にわかりやすい記事を参考にさせていただいた
まずはサンプルコード
ruby
1require 'net/http' #標準ライブラリの呼び出し 2require 'uri' 3require "json" #jsonを使うためのライブラリ 4 5#指定のURLにJSONデータをリクエストしている 6res = Net::HTTP.get(URI.parse('http://zipcloud.ibsnet.co.jp/api/search?zipcode=6695221')) 7 8#表示する 9puts res
console
1# 実行結果 2{ 3 "message": null, 4 "results": [ 5 { 6 "address1": "兵庫県", 7 "address2": "朝来市", 8 "address3": "和田山町秋葉台", 9 "kana1": "ヒョウゴケン", 10 "kana2": "アサゴシ", 11 "kana3": "ワダヤマチョウアキバダイ", 12 "prefcode": "28", 13 "zipcode": "6695221" 14 } 15 ], 16 "status": 200 17}
返ってきたjsonデータを確認することが可能。
もう少し実践的なプログラム
ruby
1require 'net/http' 2require "json" 3require 'uri' 4 5#住所を返却する。無効な郵便番号に関してはメッセージを返す 6def search_address(post_code) 7 res = Net::HTTP.get(URI.parse("http://zipcloud.ibsnet.co.jp/api/search?zipcode=#{post_code}")) 8 hash = JSON.parse(res) 9 10#有効な郵便番号の判別 11 if hash["status"] == 200 12 #住所を返す 13 return hash["results"][0].values.take(3).join("") 14 else 15 #エラーメッセージを返す 16 return hash["message"] 17 end 18end 19 20print "検索する郵便番号を入力してください(ハイフン無し):" 21post_code = gets.chomp 22 23#結果を表示する 24puts search_address(post_code)
初心者にも非常にわかりやすい解説で関心したのだけど...
console
1# 実行し、郵便番号1000001を入力してみる 2$ ruby post.rb 3検索する郵便番号を入力してください(ハイフンなし):1000001 4# 実在する住居表示が出ました 5東京都千代田区千代田
console
1# 実行し、実在しない郵便番号0000000を入力してみる 2$ ruby post.rb 3検索する郵便番号を入力してください(ハイフンなし):0000000 4# nilエラーが発生 5Traceback (most recent call last): 6 1: from post.rb:20:in `<main>' 7post.rb:12:in `search_address': undefined method `[]' for nil:NilClass (NoMethodError)
あれ、条件分岐で有効な郵便番号を判別し、無効な郵便番号に対してはメッセージを返すのでは?
サンプルコードで、
json
1{ 2 "message": null, 3(省略)
となっていたことを思い出しましたが、
- json形式で返ってきた"message"がnullなことによってnil:NilClassエラーが起こっている
- 条件分岐が良くなくて、
elsif
でnilエラーを回避できていない - 写経のどこかでスペルミスが起こっている
- それ以外
のどれかが考えられます(「それ以外」を選択肢に含めた時点で必ずどれかなのですが)。
実装したいもの
本当は、実在しない郵便番号を入力したらerrorではなくて"do not exist"とか"入力された値は無効です"などdのメッセージを表示してtrueにしたいです。
解決策は何かありますでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/30 01:30