LoginSignup
3
8

More than 5 years have passed since last update.

RubyでhttpsのAPI叩いてJSONをファイルに保存してそのファイルをJSONとして読み込むまで

Posted at

RubyでAPIたたくときのコードの書き方や、ファイルへの保存、JSONの扱いなどについてのメモです。

ざっくり流れ

  1. httpsのAPIをたたいて、JSONを取得
  2. 取得したJSONを.jsonで保存
  3. 更に、保存した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

3
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
8