我正在编写一个插件解析器,该插件可以使用Poison解码JSON(我更愿意让Plug.Parsers.JSON
这样做,但是我需要读取原始请求正文以针对签名进行验证,因此这是不可能的。)
我正在使用Poison.decode/2
来解码json。这将返回一个错误的{:error, ...}
元组。作为Plug解析器,我认为如果解析期间发生错误,我会提高Plug.Parsers.ParseError
。但是ParseError
需要一个exception
结构。我没有其中之一,我只有从Poison.decode/2
返回的元组。
作为一种解决方法,我可以使用Poison.decode!/2
和rescue
引发错误,将其重新引发为ParseError
,但是当非引发{{1 }}。
我的问题越来越抽象化:
decode/2
?ParseError
,还是最好提出自己的例外情况?答案 0 :(得分:0)
如何在没有源异常的情况下从解析器中引发
ParseError
?
您应该自己创建Plug.Parsers.ParseError
:
raise %Plug.Parsers.ParseError{exception: %MyException{message: "Failed to parse"}}
我是否需要提出
ParseError
,还是最好提出自己的例外情况?
您可以提出自己想要的任何东西,但是由于确实是ParseError
,所以我看不出有什么理由提出不同的东西。
是否有更好的方法[...]
这个人太自以为是了。 JSON解析似乎还可以。
答案 1 :(得分:0)
(我希望让
Plug.Parsers.JSON
那样做,但是我需要阅读 原始请求正文以根据签名对其进行验证,因此不是 可能)。
...
- 是否有更好的方法,可以让我无需重新实现JSON解析就可以验证签名?
离开Plug.Parsers.JSON
实际上是最好的选择。从1.5.1版开始,可以向解析器提供custom body reader,该解析器可以缓存主体以供以后使用。这比重新实现JSON解析器插件要通用得多。
这是我的自定义阅读器:
def read_body(conn, opts) do
case Plug.Conn.read_body(conn, opts) do
{res, body, conn} when res in [:ok, :more] ->
{res, body, update_in(conn.assigns[:raw_body], &((&1 || "") <> body))}
unknown ->
unknown
end
end