1

我正在编写一个插件解析器,其中包括使用 Poison 解码 JSON(我更愿意Plug.Parsers.JSON这样做,但我需要读取原始请求正文以根据签名验证它,所以这是不可能的)。

Poison.decode/2用来解码json。{:error, ...}这会在错误时返回一个元组。Plug.Parsers.ParseError作为 Plug 解析器,我认为如果在解析过程中出现错误,我应该提出。但是ParseError需要一个exception结构。我没有其中之一,我只有从Poison.decode/2.

作为一种解决方法,我可以使用 usePoison.decode!/2rescue引发的错误,将其重新提升为 a ParseError,但是当非提升decode/2可用时,这似乎很奇怪。

所以我的问题是,越来越抽象:

  1. 如何在ParseError没有源异常的情况下从解析器引发?
  2. 我需要提出ParseError,还是提出我自己的例外更好?
  3. 有没有更好的方法,允许我在不重新实现 JSON 解析的情况下验证签名?
4

2 回答 2

0

如何在ParseError没有源异常的情况下从解析器引发?

您应该Plug.Parsers.ParseError自己创建:

raise %Plug.Parsers.ParseError{exception: %MyException{message: "Failed to parse"}}

我需要提出ParseError,还是提出我自己的例外更好?

你可以随心所欲地筹集任何资金,但既然确实如此,ParseError我认为没有任何理由要筹集不同的资金。

有没有更好的方法 [...]

这个太自以为是了。JSON解析似乎没问题。

于 2018-07-03T10:56:37.193 回答
0

(我更愿意Plug.Parsers.JSON这样做,但我需要阅读原始请求正文以根据签名验证它,所以这是不可能的)。

...

  1. 有没有更好的方法,允许我在不重新实现 JSON 解析的情况下验证签名?

让它Plug.Parsers.JSON这样做实际上是最好的选择。从 1.5.1 版本开始,可以为解析器提供自定义的正文阅读器,以缓存正文供以后使用。这是一个比重新实现 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
于 2018-10-06T05:55:25.620 回答