为不同的管道呈现不同的错误(:api和:浏览器)?
在我当前的Phoenix项目中,我有一个为不同的管道呈现不同的错误(:api和:浏览器)?,api,http,elixir,phoenix-framework,Api,Http,Elixir,Phoenix Framework,在我当前的Phoenix项目中,我有一个:browser管道和一个:api管道。我想为每个管道呈现不同的错误消息。然而,我不知道如何实现它 我的router.ex类似于: scope "/api", AppWeb do pipe_through(:api) # ... end scope "/admin", AppWeb do pipe_through :browser # ... end 我希望对/admin下不存在的路由的所有请求都呈现HT
:browser
管道和一个:api
管道。我想为每个管道呈现不同的错误消息。然而,我不知道如何实现它
我的router.ex
类似于:
scope "/api", AppWeb do
pipe_through(:api)
# ...
end
scope "/admin", AppWeb do
pipe_through :browser
# ...
end
我希望对/admin
下不存在的路由的所有请求都呈现HTTP错误模板,但对任何其他路由的所有请求都呈现JSON错误模板
在config.exs
中,我有
render\u错误:[查看:AppWeb.ErrorView,接受:~w(json html)]
但是,我不确定如何继续使用错误视图
似乎每当发生路由错误时,template\u not\u found/2
函数将自动调用,但是,此函数没有conn
参数。它的参数是模板
和赋值
我是否应该检查
分配
以确定传入请求试图访问的路由?尝试检查模板似乎没有什么帮助,并且试图呈现的模板似乎都以.html
扩展名结束,即使我尝试访问/api
下的路径,正如@JoséValim指出的那样,我没有正确看到JSON错误消息的原因是因为我是通过浏览器访问页面的。如果我在请求中正确地设置了头Accept:application/json
,它就工作了
在
错误视图.ex
中的template\u not\u found
函数中,似乎只需从模板(template)中写入Phoenix.Controller.status\u message\u就足够了。您是否从浏览器访问它?浏览器赋予HTML内容类型更高的优先级,因此,一旦我们必须协商使用哪种格式,我们就会选择它。但是,如果您使用curl
执行请求,并像API客户机那样设置Accept:application/json
头,那么您应该返回json。@JoséValim谢谢。设置标题是有效的。