rack學(xué)習(xí)1

rack是ruby服務(wù)器和rack應(yīng)用程序之間的一個(gè)框架,rails,sinatra都是基
于rack構(gòu)建的,都屬于rack應(yīng)用程序。

rack提供了一個(gè)標(biāo)準(zhǔn)的接口,用于與服務(wù)器進(jìn)行交互。標(biāo)準(zhǔn)的rack程序
是一個(gè)可以響應(yīng)call的對(duì)象,可以是對(duì)象、Proc、lambda甚至是method,
它接收env參數(shù)(環(huán)境對(duì)象),返回一個(gè)數(shù)組,數(shù)組包括:

  • 狀態(tài)(status),http響應(yīng)狀態(tài)碼
  • 可以是hash,為http的header信息
  • 擁有each方法的對(duì)象,each返回字符串

rack通過(guò)中間件來(lái)進(jìn)行擴(kuò)展,即對(duì)原始的rack程序進(jìn)行裝飾,
在原有返回?cái)?shù)組的基礎(chǔ)上進(jìn)一步處理,并返回rack對(duì)象

簡(jiǎn)單的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)

上面使用中間件的方法在使用多個(gè)時(shí)容易混亂,rack有一個(gè)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方法,可以創(chuàng)建有路由的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中間件很多,在一些高并發(fā)但業(yè)務(wù)簡(jiǎn)單的網(wǎng)站或api使用時(shí)
響應(yīng)時(shí)間過(guò)長(zhǎng),在這種情況下可以考慮使用rack或者sinatra。

轉(zhuǎn)載請(qǐng)注明出處:me.angry-arthas.com/blog/2015/09/06/rakexue-xi-1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 聲明 本文系 sinatra 源碼系列第 2 篇。系列的目的是通過(guò) sinatra 學(xué)習(xí) ruby 編程技巧。文章...
    coffeeplease閱讀 758評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • 重要提醒 一定要先安裝 1.8 版本的 ruby ,因?yàn)?1.9+ 的 ruby ,String 的實(shí)例是不響應(yīng) ...
    coffeeplease閱讀 499評(píng)論 0 1
  • 這把椅子可以說(shuō)是在我人生這個(gè)階段的消費(fèi)升級(jí)中,除了房租之外最貴的東西了。 其實(shí)買(mǎi)把好一點(diǎn)的椅子這事我已經(jīng)琢磨了很久...
    一奈閱讀 730評(píng)論 0 3
  • 自從決定開(kāi)始日更,內(nèi)心是忐忑的。一方面腦子里干貨少,寫(xiě)不出好文筆;另一方面害怕自己堅(jiān)持不下去,畢竟后路沒(méi)有完全被堵...
    小皮同學(xué)閱讀 597評(píng)論 0 51

友情鏈接更多精彩內(nèi)容