ruby sinatra 内部机制(一) 博客分类: ruby sinatra
程序员文章站
2024-02-14 11:47:22
...
下面讨论的问题是,ruby sinatra是如何和服务器进行交互的。
sinatra参照的规范是rack,rack指定了一个http 服务器如何和一个app(在sinatra中,即Sinatra::Application)进行交互。
rack协议的核心指明了一个app(在rack中称为endpoint)必须能够响应call方法的调用。而server(通常称为handler),则向这个方法传参,调用这个方法。而所传递的参数则是一个hash,其中包含了一个request的相关信息:这个请求所用的http方法,请求的path,请求头等。这个方法的预期返回是包含三个元素的数组:第一个是状态码,第二个是包含响应头信息的hash,第三个是响应体。
参照这个核心协议我们可以开发我们自己的sinatra。
module MySinatra class Application def self.call(env) new.call(env) end def call(env) headers = {'Content-Type' => 'text/html'} if env['PATH_INFO'] == '/' status, body = 200, 'hi' else status, body = 404, "Sinatra doesn't know this ditty!" end headers['Content-Length'] = body.length.to_s [status, headers, [body]] end end end require 'thin' Thin::Server.start MySinatra::Application, 1234启动后,我们访问1234端口,可以得到“hi”。