【问题标题】:Apipie interferes with proper error codesAPIpie 干扰了正确的错误代码
【发布时间】:2014-07-27 15:20:07
【问题描述】:

我似乎在 Apipie 的文档中找不到这一点。

我准备好了这个 RESTful api,我想我会用 Apipie 记录它。一切都很好,而且参数验证很好,但是当验证失败时,我似乎无法让它抛出正确的 HTTP 代码作为响应。例如,我有这个 POST /users 方法,显然它在我的数据库中创建了一个用户。不错,对吧?好吧,如果出现问题,它会以 422 Unprocessable entity 进行响应,这很好,但是如果我向它抛出未通过 apipie 验证的参数,apipies 会窒息并抛出一个很好的老式错误,类似于

Failure/Error: post '/users.json', :user => d
Apipie::ParamInvalid:
  Invalid parameter 'email' value "": Must match regular expression /[a-zA-Z0-9\-.]+\@[a-zA-Z0-9\-.]+\.[a-z]{2,}/.
# ./spec/requests/usersapi_spec.rb:66:in `block (3 levels) in <top (required)>'

假设我对 email 参数进行了正则表达式验证。相反,我非常希望它能够很好地响应(可能是 json 或空体)并将响应的代码设置为 422。

有什么想法吗?

编辑:是的,我知道我可以禁用 apipie 的验证,否则...

【问题讨论】:

    标签: ruby-on-rails api rest http-headers


    【解决方案1】:

    您可以使用rescue_from,然后以对您有意义的错误进行响应。

    class ApplicationController < ActionController::Base
    
      # ParamError is superclass of ParamMissing, ParamInvalid
      rescue_from Apipie::ParamError do |e|
        render text: e.message, status: :unprocessable_entity
      end
    
      # ...
    end
    

    【讨论】:

    • 我发现这个答案非常有用并回答了这个问题。
    【解决方案2】:

    希望您已经找到了答案 - 但如果有人想禁用 Apipie 的验证 - 就在这里。

    Apipie.configure do |config|
      config.validate = false
    end
    

    【讨论】:

    • 是的,这就是我最终所做的,但它似乎更像是一种解决方法而不是解决方案。
    • 我猜最初的想法是你定义你的文档,然后你的 api 被保留在合同中。这种解决方法也是我所做的,因为我更喜欢测试作为合同。
    猜你喜欢
    • 2022-11-15
    • 2011-01-19
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2017-10-06
    • 2014-11-27
    • 2017-04-17
    • 2021-08-11
    相关资源
    最近更新 更多