4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ElixirでJson.getでAPIを取得するのは、どんな事をしてるのか

Posted at

elixirでAPIを取得して使ってみたい!
そのためにはhexのsmallexと言うパッケージを使うといいですよー。

と、チュートリアルを見ながら進めると、確かにできる。
https://qiita.com/piacere_ex/items/4c212615a4eb699dd109

おぉ。
簡単に取得できるんだー。

と言うのは分かったけど、何でそう動くの?
そう書くの?

疑問が出たので、今回はその疑問について手を動かしてみて分かったところを書いてみることに。

Json.getでAPIを取得する方法

smallexのパッケージを追加すると、使えるようになるよ。
https://hex.pm/packages/smallex

と言う事で
mix.exsファイル内に、{:smallex, "~> 0.2.3"}
を追記して、ターミナルで mix deps.get しました。
 

次にJson.getを使って、APIを取得していきます。
まずhexのリファレンスをみてみますね。

get(domain, path, header \ [])
Get JSON API (header & map_function are optional)

使い方は上記の通り。

と言っても、これだけで理解ができなかったので疑問も生まれる訳ですが…
 

使い方は、例として下記のように書いてありました。

iex> Json.get( "https://api.github.com", "/rate_limit" )[ "rate" ][ "limit" ]
60

()の中はURL。
ドメインと、パスで分けてあるのがわかる。
必要なページの中のデータをこれで拾ってくる訳ですよね。

でも、後ろの[ "rate" ][ "limit" ]は何を意味するんだろう?

これが今回の疑問点です。

ターミナルで実際に取得してみる

実際にiex内で打ってみると「60」が取得できた。
例の通りですねー。
 

で、結果の「60」と言うのは中身のどの部分なのだろう?
ドメイン、パスを分けてある所をくっつけて、URLとしてブラウザで表示してみる

{
"resources": {
    "core": {
      "limit": 60,
      "remaining": 60,
      "reset": 1548987900
    },
 ・・・(中略)・・・
 "rate": {
    "limit": 60,
    "remaining": 60,
    "reset": 1548987900
  }
}

中身はこんな感じでした。

表示されたデータの一番下に"rate"があり
その中に"limit"が入っている。

そして、"limit"が「60」だった!

 "rate": {
    "limit": 60,
    "remaining": 60,
    "reset": 1548987900
  }

と言うことなので、[ "rate" ][ "limit" ]の部分は
"rate" の中の "limit"の中身を表示するための物だった。

と言う認識で合ってるのかな…と。

 
 
別の部分でも試してみる。
"resources" "core"

iex()> Json.get( "https://api.github.com", "/rate_limit" )[ "resources" ][ "core" ] 
%{
  "limit" => 60,
  "remaining" => 60,
  "reset" => 1548988328
}

これだと、"core"の中身が全部出てくるのね!

さらに細かく出したい時は、[ ]をもう一つ後ろに足せば良い。

iex()> Json.get( "https://api.github.com", "/rate_limit" )[ "resources" ][ "core" ][ "limit" ]
60

"limit"の値が欲しいなら、[ "limit" ]を書き足せば良いわけですねぇ。
そうすれば、さらに中のをピンポイントで選んで取れました。

便利なんだなぁ。
 

そこでまた疑問。
任意の値を複数欲しい場合はこの書き方でできるの?

まぁ思いついたのでやってみた。

iex()> Json.get( "https://api.github.com", "/rate_limit" )[ "resources" ][ "core" ][ "limit", "reset"]  
** (SyntaxError) iex:5: syntax error before: "reset"

「,」で区切ったらいけそうじゃない?というのも虚しくエラー。

まぁ、ここで呼び出して使うよりも、全部のリストを拾ってから後で分ける方が
何かと使いやすいんでしょうね。
チュートリアルでもそうしてたし。

すっきりと一行で収まったら面白いなー。
と思ったけど、私の頭ではできなかったですw

 

そうそう。
あと一つ気になったのは

get(domain, path, header \ [])

このheader \ []ですが…
その前にhttpヘッダーの事を読もうと思います。

今回はここまで。

 
 

ちなみに、QiitaのAPIを使ってelixir関連の記事を取って来て、Web上に表示するやり方は
fukuokaex代表piacere_exさん
https://qiita.com/piacere_ex/items/4c212615a4eb699dd109
の記事を参考にすすめました。
 

smallexと言うパッケージを開発したのもfukuokaex代表piacere_exさんなんですね♪
チュートリアル進めた時はただ進めてただけだったので、気付かなかったです…
 

これで色んなのを抽出して使えそう。

QiitaのAPI自体のことに関してはQiita公式を見て活用してみたいな♪
https://qiita.com/api/v2/docs
と思います。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?