转载

每日一博 | 使用 Rails 5 开发 API 应用程序

http://guides.rubyonrails.org/api_app.html

Rails API vs Sinatra?

  • Rails 提供了很多out of the box的功能。
  • Rails内置对安全的处理,能够防御Timing Attacking和IP address spoofing。
  • Rails提供了conditional get,使用stale?方法检测request中的ETag和Last-Modified http头。
  • Rails会自动把HEAD http请求转换为GET,并只输出http头来响应HEAD http请求。
  • Rails的Action Pack还提供了resourceful routing、url generation、plugins。
  • Rails提供了不同级别的Caching,包括page level、action level和fragment level,fragment cache特别适用于返回nested object。
  • Rails提供了开箱即用的Basic、Digest和Token Authentication三种http身份验证。
  • Rails提供了Instrumentation API,当某些事件发生时(如处理action、发送文件、重定向、DB查询等),这些api会调用实现注册的handler。
  • Rails提供了generator用来生成model、controller、test代码和route。

基本配置

1. 创建新的应用程序

`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

2 将现有 Rails 网站改为 API 应用程序

  • 编辑
    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

默认加载的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

`

1 使用缓存

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 ```

2 使用 Rack::Sendfile

Rails controller中使用

send_file

方法会设置

X-Sendfile

头,

Rack::Sendfile

负责发送文件,它会把发送文件的工作交给前端服务(如apache、ngix、lighttpd),此外还需要将

config.action_dispatch.x_sendfile_header
配置为前端服务使用的http头名称。 具体配置 参见文档

3 使用ActionDispatch::Request

ActionDispatch::Request#params

会将json解析为action方法的参数。前提是客户端发来的http请求设置了正确的http头

Content-Type: application/json

,并且json字符串已经被编码。

4 其它 Middleware

Rails提供了很多middleware,它们可以通过下面的方式添加:

`
config.middleware.use Rack::MethodOverride

Rack::MethodOverride`是要添加的middleware的名字。

5 移除 Middleware

`
config.middleware.delete ::Rack::Sendfile

` 可以用来删除一个middleware。

选择 Controller Modules

默认情况下一个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 ```

1 添加其它 Module

所有的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。

原文  http://my.oschina.net/liunaijia/blog/729183
正文到此结束
Loading...