【问题标题】:Elixir HTTPoisin.get avoid dedup in response dataElixir HTTPoisin.get 避免响应数据中的重复数据删除
【发布时间】:2020-04-14 10:03:36
【问题描述】:

我正在调用 Elixir 中的 HTTP Rest API

url = "http://localhost:8080/getScoreData"
   case HTTPoison.get(url) do
     {:ok, %{status_code: 200, body: body}} ->
       Logger.info("body is #{inspect(body)}")
       overall_score = Jason.decode!(body, as: [%OverallScore{}])
       {:ok, overall_score}
   end

在网页浏览器中返回的

{
      "avgPass": 85.55,
      "avgFail": 14.45,
      "totalStudents": 80.0,
      "myScoreSchema": [
        {
          "average": 80.0,
          "count": 8.0,
          "percent": 80.0,
          "name": "John"
        },
        {
          "average": 0.0,
          "count": 0.0,
          "percent": 0.0,
          "name": "Cena"
        },
        {
          "average": 0.0,
          "count": 0.0,
          "percent": 0.0,
          "name": "Sunny"
        },
        {
          "average": 0.0,
          "count": 0.0,
          "percent": 0.0,
          "name": "Michael"
        }
      ]
    }

但是从上面的代码dedupsLogger.info("body is #{inspect(body)}") 行的日志 数据并返回下面的数据而不是

{
      "avgPass": 85.55,
      "avgFail": 14.45,
      "totalStudents": 80.0,
      "myScoreSchema": [
        {
          "average": 80.0,
          "count": 8.0,
          "percent": 80.0,
          "name": "John"
        },
        {
          "average": 0.0,
          "count": 0.0,
          "percent": 0.0,
          "name": "Cena Sunny Michael"
        }
      ]
    }

尽管这是一个智能功能,但我不想要这个重复数据删除功能。如何避免重复数据删除。

【问题讨论】:

  • 您可以尝试在iex 中的HTTPoison.get! "http://localhost:8080/getScoreData" 并发布您返回的内容吗? HTTPoison 极不可能删除重复数据。
  • @AlekseiMatiushkin:是的,试过了,它仍然会删除重复数据
  • 你能在终端试试curl http://localhost:8080/getScoreData吗?
  • 您使用的是哪个版本的httpoison
  • @z5ottu 我不相信HTTPoison 无论如何都会改变身体。

标签: duplicates elixir httpoison


【解决方案1】:

要消除 HTTPoison 是否真的重复数据删除,您可以先使用 elixir 获取原始响应:

defmodule Testmodule.HttpClient do
  def send_request(request, callback_host, callback_port) when is_integer(callback_port) do

    # Convert to charlist, as that's what the erlang function is expecting.
    some_host_in_net = callback_host |> String.to_charlist

    {:ok, socket} =
      :gen_tcp.connect(some_host_in_net, callback_port, [:binary, packet: :raw, active: false])

    :ok = :gen_tcp.send(socket, request)

    # Check response status
    case :gen_tcp.recv(socket, 0) do
      {:ok, response} -> :ok = :gen_tcp.close(socket)
        response
      {:error, :closed} -> IO.puts "Something went wrong."
    end

  end
end

定义您的测试请求:

def request_pool do
    """
    GET /getScoreData HTTP/1.1
    Host: localhost
    User-Agent: ExampleBrowser/1.0
    Accept: */*

    messagebody here
    """
  end

最后,您可以使用 Elixir/Erlang 来调用您的端点:

Testmodule.HttpClient.send_request(request, "127.0.0.1", 8080)

应该让您获得您在浏览器中看到的内容,此时您可以根据自己的意愿对其进行解析。

但是,一旦您尝试使用 Poison.decode 对其进行转换,请记住它可能会删除您的数据,因为它可能会将重复的键视为对值的更新,而不是允许重复的键存在于映射中.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2019-03-09
    • 2013-01-31
    • 2016-04-17
    • 2023-03-13
    • 2018-08-13
    相关资源
    最近更新 更多