Sinatra

Sinatra とは

  • Web アプリを簡単につくれるライブラリ
  • Sinatra

インストール

  • sinatra と、併せて利用する webrick の Gem をインストール
% gem i sinatra webrick

簡単な内容をブラウザ表示する

  • 適当なディレクトリにファイル main.rb を用意する
  • 以下のスクリプトを記述
require "sinatra" # sinatra 読み込み

get "/hello" do # get メソッド以降にブラウザパスを指定
  "Hello!" # ブロック内にブラウザでアクセスされた時の処理を書く
end
  • ポート番号を指定して Sinatra 起動
% ruby main.rb -p 4567

Sinatra を起動できない

  • 以下のエラーが出る
== Someone is already performing on port 4567!
/Users/username/.rbenv/versions/3.1.2/lib/ruby/3.1.0/socket.rb:201:in `bind': Address already in use - bind(2) for 127.0.0.1:4567 (Errno::EADDRINUSE)
  • 原因
    • 同じポート番号を使用したプロセスが存在する
  • 対処法
    • kill コマンドで不要なプロセスを切る
  1. ps -ax | grep ruby
    1. 現在動いているrubyのプロセスを確認する
  2. 不要とおぼしきプロセス番号を特定する
  3. kill プロセス番号

`bind': Address already in use - bind(2) for 127.0.0.1:3000 (Errno::EADDRINUSE)エラーの対処法 - Qiita

Web アプリの中で Ruby プログラムを実行

  • 配列から 1 つの要素をランダムに表示する
    • ブラウザをリロードするごとに表示内容がランダムで変わる
require "sinatra"

get "/drink" do
  ["coffee", "tea", "latte", "mocha"].sample
end

Web ページへアクセスして HTML を取得

  • 以下は『はてなブックマーク』のトップページの HTML ソースコードを取得するプログラム
require "net/http" # (1)
require "uri" # (2)

uri = URI.parse("https://b.hatena.ne.jp/") # (3)
result = Net::HTTP.get(uri) # (4)
puts result
  1. 標準添付ライブラリ net/http 読み込み
    • (4)の Net::HTTP クラスを使えるようになる
    • :: 名前空間の指定で、Net モジュールの中にある HTTP クラスを指している
  2. 標準添付ライブラリ uri 読み込み
    • (3)で URI モジュールを使えるようになる
  3. URI.parse メソッドに URL を文字列で渡すことで、URI オブジェクト(正確には URI::HTTPS オブジェクト)を作る
    • (ここでは URL と URI は同じと考えてよい)
  4. Net::HTTP.get メソッドに、(3)で作った URI オブジェクトを渡すと、URI オブジェクトが示す先の Web サーバーへ HTTP GET メソッドでリクエストを送る
    • Web サーバーが返したレスポンス HTML が戻り値となる

スクレイピングしたい場合

  • Net::HTTP.get メソッドは、リクエスト結果を文字列で返す
  • スクレイピング結果を編集したい場合は xml パーサー と呼ばれる nokogiri Gem などを利用する

Web ページへアクセスして JSON を取得

require "net/http"
require "uri"

uri = URI.parse("https://igarashikuniaki.net/example.json")
p result = Net::HTTP.get(uri)
"{\"caffe latte\":400}\n"
  • 標準添付ライブラリ json を使うと、JSON をハッシュへ変換できる
  • JSON.parse メソッドは、引数で渡した JSON である文字列を、ハッシュへと変換するメソッド
require "net/http"
require "uri"
require "json"

uri = URI.parse("https://igarashikuniaki.net/example.json")
result = Net::HTTP.get(uri)
hash = JSON.parse(result)

p result # "{\"caffe latte\":400}\n"
p hash # {"caffe latte"=>400}
p hash["caffe latte"] # 400

JSON へ変換

  • 標準添付ライブラリ json を使うと、ハッシュを JSON への変換もできる
    • to_json メソッドを使う
  • JSON へ変換することで、HTTP リクエストするときに利用などもできる
require "json"
p({mocha: 400}.to_json)
# "{\"mocha\":400}"

Web ページへ HTTP POST メソッドでリクエストする

  • ブラウザで Web ページへリクエストするときや、リクエストするプログラム
    • HTTP GET メソッドを使う
      • リクエスト先の状態を変えないときに使う
  • リクエスト先の状態を変えるときに使う HTTP POST メソッドもある
    • 例)住所を登録する際、入力フォームに情報を入れて登録ボタンを押した際に使われる
HTTP POST 自体がよく分かっていないので省略
253 ページ