Skip to content

Instantly share code, notes, and snippets.

@enpedasi
Last active April 25, 2018 02:26
Show Gist options
  • Save enpedasi/b53b76272a334a43e5a8e73fc9fd3ebe to your computer and use it in GitHub Desktop.
Save enpedasi/b53b76272a334a43e5a8e73fc9fd3ebe to your computer and use it in GitHub Desktop.
GuruNavi Elixir API example
defmodule GuruNaviApi do
def get_shops({addr, freeword}) do
iget_shops({addr, freeword}, 1, [])
end
# ページング:最終ページ
def iget_shops({_addr, _freeword}, _offset, [%{:last => true}|result] ) do
result
end
def iget_shops({addr, freeword}, offset, res_state) do
res =
HTTPoison.get!(access_url("https://api.gnavi.co.jp/RestSearchAPI/20150630/",[
"address=" <> addr,
"freeword=" <> freeword,
"hit_per_page="<> "50",
"offset_page=" <> Integer.to_string(offset)
# "range="<>"2", # 1:300 2:500 3:1km 4:2km 5:3km
]) )
|> parse_json
|> case do
%{"error" => e} -> IO.puts e
e
res -> # ヒット数=1の場合は、List化されていないのでリストにくるむ
if is_list(res["rest"]) do
res["rest"]
else
[res["rest"]]
end
|> Enum.map( fn r -> { r["name"], r["tel"], r["category"], r["opentime"] } end)
|> case do shop_list -> [ shops: shop_list ++
case res_state do
[] -> []
_ -> res_state[:shops]
end,
total_hit_count: String.to_integer(res["total_hit_count" ]),
hit_per_page: String.to_integer(res["hit_per_page" ]),
hit_count: length(shop_list),
offset: offset,
] end
end
# ページング:残行カウント
rest_count = res[:total_hit_count] - offset * res[:hit_per_page]
# IO.puts rest_count
iget_shops({addr, freeword}, offset+1, [%{:last => (rest_count <= 0)}] ++ res)
end
def access_url(url_base, opts\\[]) do
api_key = Application.get_env(:groumet, :apis)[:guru_api_key]
url_base
<> "?"
<> Enum.join( [ "format="<>"json", "keyid="<>api_key ] ++ opts, "&")
end
defp parse_json( %HTTPoison.Response{status_code: 200, body: body} ) do
body
|> Poison.decode!
end
defp parse_json( %HTTPoison.Response{status_code: 492, body: body} ) do
IO.puts "1日の利用制限に達しました"
body
|> Poison.decode!
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment