erlang Elixir :如何发送身体参数使用哈克尼

w1jd8yoj  于 2022-12-16  发布在  Erlang
关注(0)|答案(2)|浏览(173)

我正在使用hackney在elixir中发出一个post请求,它看起来运行正常,但是在接收服务上,body是空的。
我是否遗漏了一个哈克尼选项?我尝试过将主体作为charlist和原生字符串发送。

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"}
w6lpcovy

w6lpcovy1#

这为我发送了正文,但它似乎希望"application/json"作为二进制而不是字符列表。当我做一个字符列表时,我得到了一个数字内容类型头。
您的服务器可能会获取该内容类型,并以一种看起来没有发送的方式处理请求正文。
这就是我最后得到的结果(为了保持一致性,我还将头文件名改为小写二进制,但似乎没有必要)

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

qnzebej02#

一个可能的解决方案是在elixir中使用双引号字符串。
这意味着所有作为参数传递的字符串在创建时都应该用双引号而不是单引号括起来,或者在发送之前进行检查并转换为字符串类型。
适用于请求可能具有的任何字符串参数,也适用于报头:

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

而不是:

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

来自文档:
https://hexdocs.pm/elixir/1.13.1/String.html
Elixir中的字符串是UTF-8编码的二进制文件。
Elixir中的字符串是Unicode字符的序列,通常写在双引号字符串之间,例如“hello”。

另一方面,宪章派

https://elixir-lang.org/getting-started/binaries-strings-and-char-lists.html#charlists
字符列表是一个整数列表,其中所有的整数都是有效的代码点。在实践中,你不会经常遇到它们,除非在与Erlang接口时,特别是在使用不接受二进制作为参数的旧库时。
字符串(即二进制)是用双引号创建的,而字符列表是用单引号常量创建的。
字符列表不包含字节,而是包含整数代码点。但是,如果所有代码点都在ASCII范围内,则列表将用单引号打印。

相关问题