gpt4 book ai didi

elixir - Plug.Parser 不读取/解析 JSON 正文

转载 作者:行者123 更新时间:2023-12-05 01:15:39 25 4
gpt4 key购买 nike

我正在编写一个 Elixir (1.8) + Plug_Cowboy (2.0.2) + Jason (1.1.2) 服务器。根据我从文档中得到的信息,一旦 Plug 解析器通过,我应该在 body_params 中拥有所有内容。问题是在我的例子中访问 conn.body_params 返回 %Plug.Conn.Unfetched{aspect::body_params}。检查下面的代码:

defmodule Test.Router do
use Plug.Router
require Logger

plug :match
plug Plug.Parsers, parsers: [:json],
pass: ["application/json", "text/json"],
json_decoder: Jason
plug :dispatch

post "/test" do
Logger.debug inspect(conn.body_params)
conn
|> put_resp_content_type("text/plain")
|> send_resp(204, "Got it")
end
end

知道发生了什么事吗?

我测试这个:

curl -H "Content-Type: text/json" -d "{one: 1, two: 2}" 127.0.0.1:8080/test

我曾尝试将 :urlencoded 添加到解析器,或重新排列插件顺序,但无济于事。

最佳答案

Plug.Parsers.JSON仅处理 application/json 内容类型。这就是未填充 body_params 的原因。您的测试 JSON 也是无效的 - 对象属性名称没有被引用。

curl -H "Content-Type: application/json" -d '{"one": 1, "two": 2}' 127.0.0.1:8080/test

pass: Plug.Parsers 的选项指示它忽略那些没有定义解析器的类型的请求(例如 text/json 在您的情况下),而不是引发 UnsupportedMediaTypeError,这是它通常会做的。添加该选项会隐藏错误。

您可能会发现使用 Plug.Debugger 很有用在开发过程中 - 它可以让您更好地了解意外情况下发生的情况。

如果由于某种原因您需要能够解析具有非标准 text/json 类型的 JSON(例如,由于来自您无法控制的软件的请求),您可以定义一个新的该类型的解析器只包装 Plug.Parsers.JSON 并将 text/json 重写为 application/json:

defmodule WrongJson do
def init(opts), do: Plug.Parsers.JSON.init(opts)

def parse(conn, "text", "json", params, opts) do
Plug.Parsers.JSON.parse(conn, "application", "json", params, opts)
end

def parse(conn, _type, _subtype, _params, _opts), do: {:next, conn}
end

然后将其添加到您的解析器列表中:

plug Plug.Parsers,
parsers: [:json, WrongJson],
json_decoder: Jason

现在 text/json 也可以使用了。

关于elixir - Plug.Parser 不读取/解析 JSON 正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55425416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com