Elixir:如何使用 hackney 发送 body 参数

Elixir: How to send body parameters using hackney

我正在使用 hackney 在 elixir 中发出 post 请求,它似乎运行正常,但在接收服务上 body 是空的。

是否有我缺少的 hackney 选项?我试过将 body 作为字符列表和本机字符串发送。

msg = Jason.encode!(%{message: "hello"})

{:ok, 200, _, body} = :hackney.post(
  "http://localhost:2002/api/some/endpoint",
  [
    {'Content-Type', 'application/json'}
  ],
  msg,
  [:with_body]
)

IO.inspect(Jason.decode!(body), label: "response")
# => {:ok, "ok"}

它为我发送了 body,但它似乎希望 "application/json" 作为二进制文件而不是字符列表。当我做一个 charlist 时,我得到了一个数字内容类型 header.

您的服务器可能会获取该内容类型并处理请求 body,但请求似乎没有被发送。

这就是我最终得到的结果(为了保持一致性,我还将 header 名称更改为小写二进制,但这似乎没有必要)

:hackney.post("http://localhost:2002/api/some/endpoint", [{"content-type", "application/json"}], msg, [:with_body])

一个可能的解决方案是在 elixir 中使用双引号字符串。

这意味着所有作为参数传递的字符串在创建时应该用双引号而不是单引号括起来。或者在发送之前检查并可能转换为字符串类型。

适用于请求可能具有的任何字符串参数 ,也适用于 header:

{"Content-Type", "application/json"}

而不是:

{'Content-Type', 'application/json'}

来自文档:

https://hexdocs.pm/elixir/1.13.1/String.html

Elixir 中的字符串 是 UTF-8 编码的二进制文件。

Elixir 中的字符串是一系列 Unicode 字符,通常写在双引号字符串之间,例如“hello”。

另一方面,Charlists:

https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#charlists

charlist 是一个整数列表,其中所有整数都是有效代码点。在实践中,您不会经常遇到它们,除非是在与 Erlang 交互时,特别是在使用不接受二进制文件作为参数的旧库时。​​

而字符串(即二进制文件)是使用 double-quotes 创建的,字符列表是使用 single-quoted 文字.

创建的

charlist 不包含字节,而是包含整数代码点。但是,如果所有代码点都在 ASCII 范围内,列表将以 single-quotes 打印。