Ruby on Sinatra:从零开始编写API服务

Posted by baicai on November 16, 2015

QQ截图20151116170728

首先是安装Ruby和DevKit

windows下可下载对应安装包安装 <a href=”http://rubyinstaller.org/downloads/”>http://rubyinstaller.org/downloads/</a>

linux下(Debian/Ubuntu) 直接apt-get install ruby ruby-dev

然后安装相关gem包</h3> gem install sinatra

新建test.rb内容

require 'sinatra'
 
get '/' do
  "Hello, World!"
end

运行服务器</h3>
$ ruby app.rb
在浏览器中输入:localhost:4567,没问题的话就会显示Hello, World! 这段简单的Hello world程序包含了Sinatra程序的三个基本组成部分:

路由(route):

'/' 就是路由。路由可以是单一的路径,或者带有参数的路径(比如 /:name),甚至是正则表达式。对于Sinatra不知道的路由,Sinatra会返回404错误(作为App运行的时候),或者传递给下面的中间件(作为中间件运行的时候)。

方法(method):

get是方法。在Sinatra中,HTTP的四个方法GET/POST/PUT/DELETE都有相应的方法get/post/put/delete。

处理器(handler):

处理器就是最后的代码块,处理器的返回值就是Sinatra返回给客户端(主要是浏览器)的内容。返回值主要以字符串为主,也可以是包含状态码,消息头,消息体的数组。

添加主页模板

$ gem install haml #安装haml
require 'haml'
get '/' do
  haml :index
end
在这里<code>haml :index</code>,就表示使用Haml渲染'views/index.haml'这个模版。 index.haml的样式:
%html
	%head
		%title API
	%body
		%h1 Hello Api
		%p Powered by Ruby on Sinatra

添加所需的API接口

get '/promoteapp' do
  content_type :json
  'api'
end

建立相关类,获取数据库数据</h3>
gem install mysql2

gem install json
#encoding : UTF-8

require  'mysql2'
require  'json'

class Model
	def initialize (code,msg,data)
		@code = code
		@msg = msg
		@data = data
	end
	
	def to_json
		return Hash[:code => @code, :msg => @msg, :data => @data].to_json
	end
end

client = Mysql2::Client.new(:host => "localhost", :username => "test",:password=>"test",:database=>"api_service")
results = client.query("select appid,title,content,logo from promote_app where _status=10");
apps = Array.new
results.each do |row|
	appid = row["appid"]
	title = row["title"]
	content = row["content"]
	logo = row["logo"]
 	apps.push(Hash[:appid => appid, :title => title, :content => content, :logo => logo])
end
client.close if client
m = Model.new(0,'success',apps)
puts m.to_json
mysql驱动中文乱码问题严重,于是采用mysql2驱动

使用“重载”解决“每次重启的麻烦”</h3>
$ gem install sinatra-contrib
然后,在“require ‘sinatra/base’”的正后方加入: require 'sinatra/reloader' 最后,只需要通过register来声明使用重载(用Thin作服务器不能很好地运行,所以一并设定在WEBrick上)
class App < Sinatra::Base
  enable :inline_templates
  enable :logging
  set :server, "webrick"
  register Sinatra::Reloader
  #...
end
想设定为只在development环境中有效也很简单
configure :development do
  register Sinatra::Reloader
  set :server, "webrick"
end
这样,就能在运行着Sinatra进程的终端,进行设计变更、逻辑变更等各种修改(追加gem等的情况是需要重启的,这个请注意)