[原创] rails提供RESTful接口时的坑

rails RESTful

2016-09-01 1282

我现在遇到一个问题,因为牵涉到跨域访问的需求。暂时比较纠结。get和post请求都是没有问题的,当我使用put或者delete请求的时候就出问题了。

W3C规范这样要求在跨域请求中,分为简单请求(get和部分post,post时content-type属于application/x-www-form-urlencoded,multipart/form-data,text/plain中的一种)和复杂请求。而复杂请求发出之前,就会出现一次options请求。
什么是options请求呢?它是一种探测性的请求,通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。

在ajax中出现options请求,也是一种提前探测的情况,ajax跨域请求时,如果请求的是json,就属于复杂请求,因此需要提前发出一次options请求,用以检查请求是否是可靠安全的,如果options获得的回应是拒绝性质的,比如404\403\500等http状态,就会停止post、put等请求的发出。

rails中解决方案一
     此方法没有进行尝试
rails中解决方案二
思路:在路由中配置一个空白的options请求响应,所有的options方式的请求都走此处进行处理

routes.rb

match '*all', to: 'application#do_options', via: [:options]

application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :null_session
  # ...

  def do_options
    p 'hehehehheh'
    p request.method
    if request.method == 'OPTIONS'
      response.headers["Access-Control-Allow-Origin"] = "*"
      response.headers["Access-Control-Allow-Headers"] = "Origin, X-Requested-With, Content-Type, Accept"
      response.headers["Access-Control-Allow-Methods"] = "PUT,POST,GET,DELETE,OPTIONS"
      response.headers["X-Powered-By"] = '3.2.1'
      render :text => '', "content-type" => 'text/plain'
    end
  end
end