Gemを利用しないでAPIを扱ってみよう

#楽天商品検索APIを使ってみよう
まず企業や団体が提供しているAPIを利用するためには、大抵の場合そのサービスへの利用申請が必要になります。これはAPIを利用する時にパスワードとなる**アプリケーションID**を発行してもらうためです。

アプリケーションIDを取得したら、それを含めたリクエストを送るコードを書き、実行します。

すると返り値に、各APIが処理した後の値が帰ってきます。この値のデータ型は楽天商品検索APIでは**JSON**というものになっています。なのでこれをRubyで扱えるようにするために、ハッシュへと変換します。

その後、ハッシュの値を出力するなどのコードを書きます。

大まかな流れは以下のようになります
1. 楽天APIを使うためのアプリ登録をし,アプリケーションIDを取得する
2. RubyでWeb APIへリクエストするコードを書く
3. JSONというデータ型で返って来た値をRubyのハッシュに変換するコードを書く

##楽天APIを使うためのアプリ登録をし,アプリケーションIDを取得する

以下のページからアプリケーションIDを取得することができます。
[Rakuten Web Service](https://webservice.rakuten.co.jp/app/create)

ここでは

- アプリ名
- アプリURL

を記入する必要がありますが、今は存在しないもので大丈夫です。

これでアプリIDを取得できたと思います。

##RubyでWeb APIへリクエストするコードを書く
まずAPIを使いたいアプリのあるディレクトリに、Rubyファイルを作成しましょう。

```
$ touch rakuten_api.rb
```
続いて、先ほど作成したアプリIDを.bash_profileに環境変数として書き込みます

###環境変数とは
環境変数は、サーバーに直接登録して参照できる変数のことです。外部に漏らしたくないパスワードなどの情報（今回でいうアプリID）を、直接環境下に置くことで、外部から不正に利用されることを防ぎます。

**1. bash_profileに環境変数を書き込む**

```terminal:ターミナル
$ sudo vi ~/.bash_profile
```

**2. 「i」を入力して、入力モードにする**

**3. アプリケーションIDを記述する**

```ruby:.bash_profile
export RAKUTEN_APP_ID='取得したアプリIDを記述'
```

**4. 記述が終わったら、「esc」キーを押してから「:wq」「エンター」で保存します。**

**5. 先ほどの記述を読み込ませます。**

```terminal:ターミナル
$ source ~/.bash_profile
```

###次にAPIを利用するためのコードを書きます。
以下のコードは先ほど作成した、rakuten_api.rbに記述します。

全体のコードは以下のようです。

```ruby:rakuten_api.rb
require 'net/http'
require 'uri'
require 'json'

puts "検索したい文言を入力してください！"
search_word = gets.chomp

appid = ENV["RAKUTEN_APP_ID"]

url = URI.parse(URI.escape("https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?applicationId=#{appid}&keyword=#{search_word}"))
res = Net::HTTP.start(url.host, url.port, use_ssl: true){|http|
    http.get(url.path + "?" + url.query);
}
obj = JSON.parse(res.body)
puts obj
```
細かい操作についてみていきます。

####まず標準ライブラリを呼び出す
rubyには組み込みライブラリとは別に、標準ライブラリというのがあります。組み込みライブラリはファイルに特別な記述をしなくても最初から利用できます。ところが、組み込みライブラリには含まれていない機能を使う際には標準ライブラリを使います。http通信を扱ったり、CSVファイルの操作をしたりするライブラリが存在します。

（今回はGemを使わないでAPIを利用するので、この操作が必要となります。もしGemを使うのであれば、必要な標準ライブラリも自動で呼び出されるので必要ないです。）

標準ライブラリは、Gemを利用するのと同様にrequire ◯◯という記述によって呼び出します。
以下のコードは net/http と uri という標準ライブラリを設定しています。

```ruby:rakuten_api.rb
require 'net/http'
require 'uri'
require 'json'
```
これらは、必要な標準ライブラリを呼び出すための記述です。

**net/http**　はhttp通信をRubyで扱うための標準ライブラリです。。これによって、今回使うNet::httpクラスとstartメソッドが利用できるようになります。そして、Webサーバーからドキュメントを得たりフォームの情報を送信したりすることがRubyのプログラムでできます。

**uri** はURLを扱うための標準ライブラリです。URIとはURLの広義的なものです。これによって、簡単にURIのドメインなどを取り出すことができます。

３行目で、JSONファイルを読み込めるようにします。

次に具体的な操作をみていきます。
####楽天市場から商品を検索する

```ruby:rakuten_api.rb
appid = ENV["RAKUTEN_APP_ID"]

url = URI.parse(URI.escape("https://app.rakuten.co.jp/services/api/IchibaItem/Search/20140222?applicationId=#{appid}&keyword=#{search_word}"))
res = Net::HTTP.start(url.host, url.port, use_ssl: true){|http|
    http.get(url.path + "?" + url.query);
}
```
まず環境変数として.bash_profileに書き込んだものを一度変数に代入しています。

次にuri環境ライブラリを読み込んだことによって利用できるようになったURIクラスの
**parse**メソッドを使って、URIのドメインを取り出します。ここで大切なのはhtttps://app.‥
の先にある、**？以降**の部分です。これは**クエリパラメータ**と言います。
クエリパラメータとはさまざまな情報をWebサーバーに伝えるためにURLに付け加える情報のことです。

クエリパラメータの基本構造は以下のようです。

```
?パラメータ名=パラメータの値
```
パラメータは１つとは限らず、複数ある場合は&で繋いでいきます。

今回だと　applicationId　と　keyword　という２つにそれぞれアプリIDや検索ワードを代入しています。


またparseメソッドの使い方は以下のようです。

```ruby
require 'uri'
uri = URI.parse("https://www.google.co.jp/")
```
例えば、上記のように実行すると以下のようにhttpの構成要素を分解してくれます。


>uri.scheme => "https"
uri.host => "www.google.co.jp"
uri.port => "443"
uri.path => "/"

この操作によって元のコードの次の行では
NET::HTTPクラスのstartメソッドを利用し、
引数にhostやportを指定して簡単にドメイン取得できています。

ここまでで楽天市場から商品を検索することができました。

しかしまだ検索結果は、11行目の変数resにJSONというデータ形式で代入されています。

####JSONをハッシュに変換する

```ruby:rakuten_api.rb
obj = JSON.parse(res.body)
puts JSON.pretty_generate(obj)
```
15行目では、JSONクラスのparseメソッドを利用してJSON形式のデータをRubyのハッシュクラスのインスタンスに変換しています。つまり、変数objはハッシュになっている、ということです。あとは、このハッシュから必要な情報を取り出して利用するだけです。