Elixir HTTPoisin.get избегать дедупликации в данных ответов - PullRequest
1 голос
/ 14 апреля 2020

Я звоню в 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"
        }
      ]
    }

, но журнал по строке Logger.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"
        }
      ]
    }

Хотя это умная функция, но я не хочу эту функцию дедупликации. Как избежать дедупликации.

1 Ответ

1 голос
/ 15 апреля 2020

Чтобы устранить, действительно ли 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, имейте в виду, что он, скорее всего, приведет к дедупликации ваших данных, поскольку он может рассматривать дублированные ключи как обновления значений, а не позволять существовать дублирующим ключам. на карте.

...