/var/log/messages

Feb 26, 2019 - 2 minute read - Comments - programming

プログラミング Elixir (19)

HTTPoison の Github のドキュメントを確認してみます。以下で良いのかどうか。

導入

今は mix.exs で以下らしい。

def deps do
  [{:httpoison, "~> 1.4"}]
end

最新の安定板は 1.4 なのか。そして elixir が 1.3 より上の version だと以下の記載は不要らしい。

def application do
  [applications: [:httpoison]]
end

なるほど。

Wrapping HTTPoison.Base

の節で以下な記載があります (機械翻訳)。

あなたのモジュールでHTTPoison.Baseモジュールを使ってクールなAPIクライアントか何かを作ることもできます。 次の例では GitHub API 用のクライアントを構築するために HTTPoison.Base をラップしています(JSON デコードには Poison が使用されています)。

以下なコードが例示されています。

defmodule GitHub do
  use HTTPoison.Base

  @expected_fields ~w(
    login id avatar_url gravatar_id url html_url followers_url
    following_url gists_url starred_url subscriptions_url
    organizations_url repos_url events_url received_events_url type
    site_admin name company blog location email hireable bio
    public_repos public_gists followers following created_at updated_at
  )

  def process_request_url(url) do
    "https://api.github.com" <> url
  end

  def process_response_body(body) do
    body
    |> Poison.decode!
    |> Map.take(@expected_fields)
    |> Enum.map(fn({k, v}) -> {String.to_atom(k), v} end)
  end
end

これ、HTTPoison.Base を use したことで以下が使える、ということなのか成程。

def process_request_body(body), do: body

def process_request_headers(headers) when is_map(headers) do
  Enum.into(headers, [])
end

def process_request_headers(headers), do: headers

def process_request_options(options), do: options

def process_request_url(url), do: url

def process_response_body(body), do: body

def process_response_chunk(chunk), do: chunk

def process_response_headers(headers), do: headers

def process_response_status_code(status_code), do: status_code

ええと、以下な実行例が引用されています。(まだ訳がわかっていない)

iex> GitHub.start
iex> GitHub.get!("/users/myfreeweb").body[:public_repos]
37

これってリクエストのレスポンスに .body な呼び出しを、で process_response_body が呼び出されます、ということなのかな。body だと

  • @expected_fields なナニの値を key-value に map して辞書にして戻す

ってことしてるのか。あと、get! の引数は url な手続きが呼び出されてるんですね。

JetPack 本 OODA LOOP

comments powered by Disqus