如果我向我的api端点发出curl请求并且存在问题(在开发中),那么我看到:
>curl --user me:mypassword http://localhost:3000/api/v1/magic_endpoint.json
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Action Controller: Exception caught</title>
<style>
... stuff
<body>
<header>
<h1>
ActiveRecord::PendingMigrationError
</h1>
</header>
... more stuff
这真令人讨厌和讨厌。当json被要求时,如何告诉rails不返回HTML?我在这里看到了许多与此类似的问题,答案是将您的404/500在routes.rb中重定向到自定义错误控制器并手动渲染json,内部错误或“未找到”,但我不想去做。 Rails输出实际错误,在这种情况下, ActiveRecord :: PendingMigrationError ,我不想隐藏它...我只是不想在视觉上解析一堆html标记找出错误是什么。
答案 0 :(得分:0)
你可以添加
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
到您的config/environments/development.rb
,但是完全关闭了异常到响应转换,因此您甚至无法获得HTTP状态代码,当然也没有异常的跟踪信息回应者的身体。
我猜你真正想要的是将异常响应转换为“神奇地”#39;仍然发生,但结果是JSON。我不认为股票Rails可以配置为这样做(缺少猴子修补ActionDispatch::ExceptionWrapper
,这个特殊的魔法发生在那里)。但是可能有宝石(Ruby库)提供Rails引擎,使Rails能够完成您想要的任务。
curl
?要探索API实施的行为,编写自动tests或request specs可能比使用curl
手动查询更合适。然后,那些确定所需行为的东西可以保持在开发期间并在运行期间运行,这样他们就可以告诉您行为何时意外地发生变化。
答案 1 :(得分:0)
我认为在您的控制器中您可以执行以下操作:
rescue_from StandardError do |ex|
if request.format.json?
render text: ex.message
else
raise ex
end
end
但是这样做有一些副作用,例如日志中不会显示异常。 (但你当然可以手动登录)。
答案 2 :(得分:0)
根据das-g的建议,我决定在我的.bashrc中编写一个函数,我称之为“crimp”,因为它与curl有关(哈哈):
crimp() {
curl $@ | lynx -stdin
}
现在我可以做到:
crimp --user me:secret http://localhost:3000/api/v1/my_endpoint.json
我不再需要阅读令人讨厌的HTML标签了。