[Ruby] Sinatra — 輕量級 Ruby Web 框架

Sinatra 是Blake Mizerany在2007年9月開發的Ruby語言的Web框架,是建置在 Rack 之上的程式庫,提供完全HTTP化的DSL,最大的特點是輕量。

快速建立 Sinatra webapp

首先安裝 gem ‘sinatra’,並 $ bundle install

source 'https://rubygems.org'
gem 'sinatra', '~> 2.0.0.rc2'

建立app.rb

# app.rb
require 'sinatra'

get '/' do
info = "#{params[:name]} form #{params[:country]}"
"Hello, #{info}!"
end

執行

$ ruby app.rb
== Sinatra (v1.4.8) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Version 3.8.2 (ruby 2.3.1-p112), codename: Sassy Salamander
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:4567
Use Ctrl-C to stop

預設的 Sinatra 會在 4567 通訊埠上監聽。如果請求一個不存在的url,Sinatra會傳回 404 錯誤程式,並提供一個預設的 404 頁面。

使用curl測試:

$ curl http://localhost:4567/\?name\=peyton\&country\=Taiwan
Hello, peyton form Taiwan!

完成!

Sinatra 還可以將請求 URL 中的一部分解析爲參數,如:

get '/users/:id' do
"Details for user #{params[:id]}"
end

POST 請求

post '/' do
data = JSON.parse request.body.read
data.to_json
end

curl 測試

$ curl -X POST -d "{\"name\": \"peyton\", \"country\": \"Taiwan\"}" http://localhost:4567/
{"name":"peyton","country":"Taiwan"}
# -X POST 參數表示本次請求將使用POST,-d 表示需要被傳輸到伺服器的資料

Sinatra 過濾器(Filters)

  • before: 在每個request前先執行。
before '/protected/*' do
authenticate!
end
  • after: 在每個request後執行。
after '/create/:slug' do |slug|
session[:last_slug] = slug
end
  • agent: 依照瀏覽器的agent決定執行的內容。
get '/', :agent => /.*MSIE.*/ do
"You are using IE"
end

Provides 回應不同格式內容

根據用戶端請求中的Accept標頭來回應不同格式的資料:

get '/', :provides => 'html' do
"<div>This is root</div>"
end
get '/', :provides => 'json' do
{:content => "This is root"}.to_json
end
get '/' do
"This is root"
end

curl測試

$ curl -H "Accept: text/html" http://localhost:4567/
<div>This is root</div>

建立一個模組化的 Sinatra demo app

Sinatra也可以作爲靜態檔案的 Web 伺服器使用。依照預設的設定,Sinatra 會在目前的目錄下的 public 子目錄尋找靜態內容並回應,而用於展現的範本則預設放在目前的目錄下的 view 子目錄中。

首先,建立一個HTML檔案 views/index.html

<!DOCTYPE html>
<
html lang="en">
<
head>
<
title>The index page of Sinatra demo</title>
</
head>
<
body>
<
img src="/images/logo.png" alt="sinatra">
<
h2>Hello, welcome to sinatra demo app</h2>
</
body>
</
html>

頁面中包含了一張路徑爲 /images/logo.png 的圖片,實際上 Sinatra 會在當前目錄的 public/images/ 資料夾中尋找圖片 logo.png。

建立 sinatra 應用程式:

require 'sinatra/base'
module MyModule
class MyApplication
< Sinatra::Base
get '/index' do
File.
read("views/index.html")
end
end
end

建立 config.ru

require './app'
run MyModule::MyApplication

執行 $ rackup config.ru 並中瀏覽器中請求 http://localhost:9292/index,就會看到我們完成的 demo app。範例檔案

參考:

  • Sinatra
  • 「還在寫PHP?大師才用輕量級Ruby、JavaScript開發Web」- 邱俊濤 / 佳魁資訊
Show your support

Clapping shows how much you appreciated Dosmanthus’s story.