引发异常时如何保留响应标头?
Posted
技术标签:
【中文标题】引发异常时如何保留响应标头?【英文标题】:How to preserve response headers when raising an exception? 【发布时间】:2014-03-02 07:09:55 【问题描述】:我正在使用rack-cors 在我们的 API 请求中添加 CORS 响应标头。
请求成功时(200)它工作正常。但是,当应用程序通过 authenticate_user!
(401) 引发异常 ActiveRecord::RecordNotFound
(404) 或 devise/invalid credentials 时 - 它不会使用 CORS 响应标头进行响应。
它不仅适用于机架。它不会响应在引发异常之前添加的任何自定义标头。
最大的问题在于客户端(浏览器),因为它没有根据状态码显示正确的错误,而是显示:
XMLHttpRequest 无法加载 http://development.com:4000/orders/1。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://development.com:3000' 因此不允许访问。
如果我手动捕获异常 rescue_from
和 render json: , status: 500
,它会以标题响应。
【问题讨论】:
你需要启用CORS
看这个问题***.com/questions/17858178/…
@BrianWheeler 它由 rack-cors 启用。
【参考方案1】:
我一直在与这个问题作斗争,答案是:
设置 Rack::Cors 中间件的顺序很重要。像这样使用它:
config.middleware.insert_after Rails::Rack::Logger, Rack::Cors, :logger => Rails.logger do
allow do
origins '*'
resource '*', headers: :any, methods: %i[get post patch put delete options]
end
end
更多信息:https://github.com/cyu/rack-cors/issues/33
【讨论】:
先生,你成就了我的一天!以上是关于引发异常时如何保留响应标头?的主要内容,如果未能解决你的问题,请参考以下文章