rack學習1
rack是ruby伺服器和rack應用程式之間的一個框架,rails,sinatra都是基
於rack構建的,都屬於rack應用程式。
rack提供了一個標準的介面,用於與伺服器進行互動。標準的rack程式
是一個可以響應call的物件,可以是物件、Proc、lambda甚至是method,
它接收env引數(環境物件),返回一個陣列,陣列包括:
- 狀態(status),http響應狀態碼
- 可以是hash,為http的header資訊
- 擁有each方法的物件,each返回字串
rack通過中介軟體來進行擴充套件,即對原始的rack程式進行裝飾,
在原有返回陣列的基礎上進一步處理,並返回rack物件
簡單的rack程式
require 'rack'
app = lambda{|env|[200,{},["hello from rack"]]}
Rack::Handler::WEBrick.run app
使用中介軟體的rack程式
require 'rack'
class Decorator
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
new_body = "from middleware input <br/>"
body.each{|str| new_body << str}
headers['Content-Length'] = new_body.bytesize.to_s
[status, headers, [new_body]]
end
end
app = lambda{|env|[200,{},["hello from rack"]]}
Rack::Handler::WEBrick.run Decorator.new(app)
上面使用中介軟體的方法在使用多個時容易混亂,rack有一個Builder類可以有效管理
使用如下
require 'rack'
require 'decorator'
app = Rack::Builder.new{
use Rack::ContentLength
use Decorator
run lambda {|env| [200, {"Content-Type"=>"text/html"}, ["hello world"]]}
}.to_app
Rack::Handler::WEBrick.run app
使用Rack::Builder的map方法,可以建立有路由的rack程式
require 'rack'
app = Rack::Builder.new {
map '/hello' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["hello"]] } end
map '/world' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["world"]] }
end
map '/' do
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["all"]] } end
}.to_app
Rack::Handler::WEBrick.run app, :Port => 3000
由於rails的全棧性,rack中介軟體很多,在一些高併發但業務簡單的網站或api使用時
響應時間過長,在這種情況下可以考慮使用rack或者sinatra。
相關文章
- 學習1
- Vuex學習(1)Vue
- flask學習1Flask
- Kettle學習1
- Vue學習-1Vue
- php學習(1)PHP
- Jquery學習1jQuery
- AJAX學習1
- Java學習(1)Java
- odoo學習-1Odoo
- NLP學習1
- js學習1JS
- python學習1Python
- java學習之旅-1Java
- DNS深入學習-1DNS
- 學習筆記1筆記
- Vue學習心得(1)Vue
- 學習筆記-1筆記
- NumPy 學習(1): ndarrays
- postgresql學習-Part 1SQL
- CSS學習1—-基本CSS
- Elixir學習之路1
- Timesten學習1
- 藍芽學習1藍芽
- vector 學習初步(1)
- 學習理解篇1
- oracle 學習筆記---效能優化學習(1)Oracle筆記優化
- javaweb學習之路(1)requestJavaWeb
- shell學習總結-1
- codeigniter學習1
- swift學習筆記《1》Swift筆記
- Vue學習筆記1Vue筆記
- flutter學習記錄-1Flutter
- Redis學習總結1Redis
- Numpy學習筆記 1筆記
- HTML學習筆記1HTML筆記
- python tkinter學習(1)Python
- Numpy學習 Day1