RubyでAPIたたくときのコードの書き方や、ファイルへの保存、JSONの扱いなどについてのメモです。
ざっくり流れ
- httpsのAPIをたたいて、JSONを取得
- 取得したJSONを.jsonで保存
- 更に、保存したJSONファイルからJSONオブジェクトの読み込み
やりたいことは、1だけでしたが、
どうせならファイルに保存するとこまでやってみたい
更にどうせならJSONファイルの読み込みもやってみたい
と思い、2と3を追加しました。
今回対象とするAPIは、GitHub Search APIです。
ソースで使用しているパラメタなども、Referenceに書かれているものをそのまま使用しています。
他の人のソースからの引用がかなり多く、理解しきれていない部分もあると思いますが、いったんやりたかったことはできたので、OKとしています。
※特にSSL周りでかなりはまりました。引用に記載されている記事がなかったらどうなっていたことやら。。。
# https通信に必要
require 'openssl'
require 'net/http'
# JSON加工用に必要
require 'json'
# Logger
require 'logger'
TIMEOUT_SEC = 10
# ロガー
logger = Logger.new('./webapi.log')
url = 'api.github.com'
https = Net::HTTP.new(url, 443)
https.open_timeout = TIMEOUT_SEC
https.read_timeout = TIMEOUT_SEC
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.verify_depth = 5
# [OpenSSL::SSL::SSLError]への対応のため、証明書を直に指定
https.ca_file = 'C:\cacert.pem'
begin
response = nil
path = '/search/repositories?q=tetris+language:assembly&sort=stars&order=desc'
https.start do
response = https.get(path)
end
# 同階層にSample.jsonがなかったら作成、あったらその末尾にputsしていく
File.open('.\Sample.json', 'a') do |file|
file.puts response.body
end
# ファイルからJSONオブジェクトの読み込み
File.open('.\Sample.json') do |file|
hash = JSON.load(file)
puts hash['total_count']
end
# rescueするErrorは今回発生したものだけにしておく
rescue OpenSSL::SSL::SSLError => e
logger.error([e.class, e.message].join(' : '))
logger.error('証明書関係のエラー')
rescue JSON::ParserError => e
logger.error([e.class, e.message].join(' : '))
rescue => e
logger.error([e.class, e.message].join(' : '))
end
ちょっと試してみるだけのつもりが、GitHub Apiがhttpsなため、SSL周りでかなり苦労しました。。。
httpでも叩くことができるAPIにしておくべきでしたね。
まぁ、普段あまり意識することがないセキュリティ部分に若干触れることができたので、良しとします!
参考にしたサイト
[OpenSSL::SSL::SSLError]の解決(非常に助かりました。これらの記事がなかったら、完全に挫折していました。)
http://d.hatena.ne.jp/komiyak/20130508/1367993536
https://mcrn.jp/blog/2015/10/28/205049.html
RubyでJSONを扱うため
http://qiita.com/awakia/items/bd8c1385115df27c15fa
Loggerについて
http://qiita.com/mogulla3/items/a4bff2e569dfa7da1896