http://guides.rubyonrails.org/api_app.html
`bash $ mkdir myapi $ cd myapi $ rvm use ruby-2.3.1@myapi --ruby-version --create $ gem install rails $ rails new . --api
`
--api的用途: - 去除网站所需的组件; - ApplicationController继承ActionController::API,而不是ActionController::Base; - Generator不会生成view、helper和assset。 - 创建新项目时会删除下面的这些文件 remove app/assets remove lib/assets remove tmp/cache/assets remove vendor/assets remove app/helpers remove test/helpers remove app/views/layouts/application.html.erb remove public/404.html remove public/422.html remove public/500.html remove public/apple-touch-icon-precomposed.png remove public/apple-touch-icon.png remove public/favicon.ico remove app/assets/javascripts remove config/initializers/assets.rb remove config/initializers/session store.rb remove config/initializers/cookies
serializer.rb
config/application.rb,指定
api_only选项。
config.api_only = true
config/environments/development.rb,修改
config.debug_exception_response_format配置,
:default使用html页面输出debug信息,
:api表示把debug信息放到api响应中,所以如果是Rails API项目,应该使用
:api。
config.debug_exception_response_format = :api
ApplicationController的基类从
ActionController::Base改为
ActionController::API。
默认加载的middleware有: * Rack::Sendfile * ActionDispatch::Static * ActionDispatch::Executor * ActiveSupport::Cache::Strategy::LocalCache::Middleware * Rack::Runtime * ActionDispatch::RequestId * Rails::Rack::Logger * ActionDispatch::ShowExceptions * ActionDispatch::DebugExceptions * ActionDispatch::RemoteIp * ActionDispatch::Reloader * ActionDispatch::Callbacks * Rack::Head * Rack::ConditionalGet * Rack::ETag
参阅 internal middleware 查看这些middleware的详细介绍。
执行下面的命令可以查看所有的middleware:
` $ rails middleware
`
Rails提供了基于memcache的HTTP缓存功能。
stale?
方法会比较
If-Modified-Since
和
@post.updated_at
的值,以决定返回
304 Not Modified
状态码还是返回最新的数据及
Last-Modified
http头。 ```ruby def show @post = Post.find(params[:id])
if stale?(last modified: @post.updated at) render json: @post end end
` 默认情况下,缓存是基于每个客户端的,如果想启用跨client的缓存,可以使用`public: true`参数,这时缓存是基于url的。
`ruby def show @post = Post.find(params[:id])
if stale?(last modified: @post.updated at, public: true) render json: @post end end ```
Rails controller中使用
send_file
方法会设置
X-Sendfile
头,
Rack::Sendfile
负责发送文件,它会把发送文件的工作交给前端服务(如apache、ngix、lighttpd),此外还需要将
config.action_dispatch.x_sendfile_header配置为前端服务使用的http头名称。 具体配置 参见文档
。
ActionDispatch::Request#params
会将json解析为action方法的参数。前提是客户端发来的http请求设置了正确的http头
Content-Type: application/json
,并且json字符串已经被编码。
Rails提供了很多middleware,它们可以通过下面的方式添加:
` config.middleware.use Rack::MethodOverride
Rack::MethodOverride`是要添加的middleware的名字。
` config.middleware.delete ::Rack::Sendfile
` 可以用来删除一个middleware。
默认情况下一个API应用程序(使用了
ActionController::API
)具有下面的module: *
ActionController::UrlFor
:实现了
url_for
方法; *
ActionController::Redirecting
:实现了
redirect_to
; *
AbstractController::Rendering
和
ActionController::ApiRendering
:基本的渲染支持; *
ActionController::Renderers::All
:支持
render :json
等; *
ActionController::ConditionalGet
:支持
stale?
; *
ActionController::BasicImplicitRender
:Makes sure to return an empty response if there's not an explicit one. *
ActionController::StrongParameters
:Support for parameters white-listing in combination with Active Model mass assignment. *
ActionController::ForceSSL
:提供
force_ssl
的支持; *
ActionController::DataStreaming
:提供
send_file
和
send_data
的支持; *
AbstractController::Callbacks
:提供
before_action
等类似方法; *
ActionController::Rescue
:支持
rescue_from
; *
ActionController::Instrumentation:支持Action Controller定义的instrumentation hooks,具体内容 参阅文档
; *
ActionController::ParamsWrapper
:将参数hash包装到一个嵌套的hash,这样不需要为发送POST请求指定根元素;
下面的命令可以查看所有的module。 ``` $ bin/rails c
ActionController::API.ancestors - ActionController::Metal.ancestors ```
所有的module都知道自己所依赖的其它module,所以添加一个module,其所依赖的module也会自行加入。增加一个module最好的地方是在
ApplicationController
中,也可以在每个需要的controller中添加module。
一些常见的module有: *
AbstractController::Translation
:支持国际化和多语言。 *
ActionController::HttpAuthentication::Basic (or Digest or Token)
:提供基本的http认证。 *
ActionView::Layouts
:render的时候支持layout; *
ActionController::MimeResponds
:支持
respond_to
方法。 *
ActionController::Cookies
:支持cookies,包括签名和加密的cookie,这个module需要启用cookies middleware。