为不同的管道呈现不同的错误(:api和:浏览器)?

为不同的管道呈现不同的错误(: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

在我当前的Phoenix项目中,我有一个
: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谢谢。设置标题是有效的。