Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@F_H_23

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

More than 3 years have passed since last update.

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

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
F_H_23

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?