如何处理Cowboy REST处理程序错误消息的媒体类型

如何处理Cowboy REST处理程序错误消息的媒体类型,rest,erlang,cowboy,media-type,Rest,Erlang,Cowboy,Media Type,我希望用户有机会选择从服务器接收响应的格式,无论是纯文本、json还是xml。看起来我必须通过调用cowboy_req:meta/{2,3}来检索媒体类型,然后使用它来编码响应体。但该值在提供内容类型之前的回调中不可用(格式错误的请求、已授权、禁止…) 我是否应该应用牛仔逻辑并编写自己的代码来确定媒体类型 或者忽略在确定媒体类型之前执行的所有回调 或者我应该将响应消息放入请求元数据并在onresponse钩子中编码,然后替换响应体吗 我该怎么做呢?我想你不太聪明。直接从init/3和rest\u

我希望用户有机会选择从服务器接收响应的格式,无论是纯文本、json还是xml。看起来我必须通过调用cowboy_req:meta/{2,3}来检索媒体类型,然后使用它来编码响应体。但该值在提供内容类型之前的回调中不可用(格式错误的请求、已授权、禁止…)

我是否应该应用牛仔逻辑并编写自己的代码来确定媒体类型

或者忽略在确定媒体类型之前执行的所有回调

或者我应该将响应消息放入请求元数据并在onresponse钩子中编码,然后替换响应体吗


我该怎么做呢?

我想你不太聪明。直接从
init/3
rest\u init/3
函数开始,
Request
参数为“full Request”,您可以读取每个回调中的任何头或元

就我个人而言,我会选择Header而不是Meta(因为已经定义了
内容类型
Header,并且Header应该取代Meta)

一般来说,cowboy中的REST回调应该只为您提供易于理解的处理请求的工作流,以及附加的默认响应代码。在
is_authorized/2
中,您只需检查授权,只需返回true或false(作为元组的一部分),cowboy就可以继续使用您的逻辑或返回
401
代码。检查是否允许某人发出请求不应根据响应格式确定,但是,如果您想这样做,只需从
Req
参数中读取此元,并根据它返回true/false


content\u types\u provided/2
的唯一区别在于,您返回
content-types
头值和函数之间的绑定。我认为您所需要的一切都可以基于此

我经常做出一个艰难的决定:“所有状态代码响应主体都将是文本/普通”(或应用程序/json)。这更容易管理。在我的例子中,我希望在每个请求上返回一个带有人类可读消息的响应主体。当然,我可以忽略请求的元,只处理头。在这种情况下,我需要读取Accept header的值,然后将其与content\u types\u提供的列表进行比较,最后我将知道响应主体的正确格式。所有这些逻辑都已经在牛仔代码中定义,因此我正在寻找一种不重新实现它的方法。