Getting Started

2019/10/4

REST API とは?

どうも、こんにちは!JellyWare株式会社です。

Getting Started!! Riiiver tutorialの第四弾となります。

本サービス『Riiiver』のチュートリアルとなるこのシリーズでは

『Riiiver』がどういったものであるのか、どのように『Riiiver』を使用するのかを学べたり、『Riiiver』と連携する時計『Eco-Drive Riiiver』の活用方法をお伝えしていきます。

最終的には『自作スマートフォンアプリ』に『Riiiver』を組みこむところまでご紹介する予定です。

第四弾では、前回の『AWS Lambda』で出てきた『REST API』と呼ばれるものを解説していきたいと思います。

『REST API』とは、かなりザックリ言うと、『Webサービスの通信ルール』のことを言います。

通信の世界は、決まり事が多くて何も知らずに踏み込むとひどく混乱しますので、ここでしっかり抑えていきましょう。


目次

  • APIとは?
  • Web APIとは?
  • RESTful API とは?

APIとは

まずは『REST API』の『API』の方から説明したいと思います。

『API』とは、『Application Programming Interface』の省略形です。

ザックリと日本語に直すと『アプリケーションをプログラミングするためのインターフェース(規約)』です。

もう少し言い換えると、『プログラミング全般(アプリケーションやソフトウェア etc…)に関する規約(インターフェース,ルール)のこと』を意味します。

まだイメージがつかないと思うので、まずは『規約(インターフェース,ルール)』というものがどういうものかを説明したいと思います。

例えばスマートフォンが普及して馴染み深い、2種類のケーブル『ライトニングケーブル』と『USBケーブル』ですが、それぞれ『iPhone』と『USBケーブル』はで使用しますよね。

しかし、『ライトニングケーブル』を『Android』で使用し、『USBケーブル』を『iPhone』で使用することはないですよね。そもそもとして物理的にケーブルを挿すことができません。

また、どのケーブルを使ってもサイズピッタリで挿すことができますよね。(USBケーブルはさらに種類が分かれるので、サイズが違う場合はありますが)

こういったことは当たり前のように感じられますが、キチンとルールが定めらているおかげで私たちは何不自由なく使うことができるのです。

このルールが『規約(インターフェース,ルール)』です。


話を『API』に戻します。

繰り返しとなりますが、『API』とは、『Application Programming Interface』の省略形です。

ザックリと日本語に直すと『アプリケーションをプログラミングするためのインターフェース(規約)』です。

もう少し言い換えると、プログラミング全般(アプリケーションやソフトウェア etc…)に関する規約のことを意味します。

コードの書き方から始まり、どういったデータ形式に統一するのか、フォルダ構造、進捗管理などなど…様々な規約があります。

また、みなさんの会社や学校やお家にも沢山ルールがあると思いますが、そういった『みんなが過ごしやすくするためのルール』もこの『API』に含まれています。

そして、自分達が作ったサービスなどを外部に提供する場合にも『API』は必要です。取扱説明書のような役割とも言えます。(詳しくは後で説明します)

APIとは

プログラミング全般(アプリケーションやソフトウェア etc…)に関する規約のこと

みんなが作業をしやすいようなルールから、データのやり取りなど機能に関するルールなど全てを意味する。

また、自作したサービスなどを外部の方に使用してもらうための説明書のようなものでもある。


WebAPIとは?

この『API』ですが、さらにいくつかの『API』に分けることができます。
そのうちの1つに『Web API』というものがあります。

その名の通り、『WebのAPI』で『Webサービスを利用してもらうためのAPI』です。

Twitter API

有名SNS『Twiitter』の『Web API』です。今までのツイートしたデータを簡単に取得することができます。

Livedoor API

ニュースサイトなどで有名なLivedoor社も『Web API』を公開しています。こちらでは天気情報などを取得することができます。

Google Map API

地図アプリと言えば、真っ先に名前の挙がる『Google Map』もAPIを提供しています。位置情報や『Google Map』を取得できます。


他にも色々あるのですが、有名なものは上記の3つとなります。

例にあげた3つからもわかるように、『Web API』というのは、『Web』つまりは『http通信』で利用する『API』です。

『http通信』というのは、みなさんが今このサイトを見られているように、ウェブブラウザを使ってWebサイトを見る時に使用されている『通信』のことを言います。

『インターネット』と何が違うの?ってなると思いますが、『インターネット』は『ファイル共有』や『電子メール』などの、パソコンとパソコンを繋げるシステムをまとめたもので、微妙にニュアンスが異なります。

試しに、『Web API』を使ってみましょう!
先ほど紹介した『Livedoor API』を使用します。

下記のURLをクリックしてみてください。

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

{"pinpointLocations":[{"link":"http://weather.livedoor.com/area/forecast/1310100","name":"\u5343\u4ee3\u7530\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310200","name":"\u4e2d\u592e\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310300","name":"\u6e2f\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310400","name":"\u65b0\u5bbf\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310500","name":"\u6587\u4eac\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310600","name":"\u53f0\u6771\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310700","name":"\u58a8\u7530\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310800","name":"\u6c5f\u6771\u533a"},{"link":"http://weather.livedoor.com/area/forecast/1310900",","title":"\u66c7\u306e\u3061\u6674","height":31}},{"dateLabel":"\u660e\u5f8c\u65e5","telop":"\u6674\u6642\u3005\u66c7","date":"2019-10-09","temperature":{"min":null,"max":null},"image":{"width":50,"url":"http://weather.livedoor.com/img/icon/2.gif","title":"\u6674\u6642\u3005\u66c7","height":31}}],"location":{"city":"\u6771\u4eac","area":"\u95a2\u6771","prefecture":"\u6771\u4eac\u90fd"},"publicTime":"2019-10-07T11:00:00\u002b0900","copyright":{"provider":[{"link":"http://tenki.jp/","name":"\u65e5\u672c\u6c17\u8c61\u5354\u4f1a"}],"link":"http://weather.livedoor.com/","title":"(C) LINE Corporation","image":{"width":118,"link":"http://weather.livedoor.com/","url":"http://weather.livedoor.com/img/cmn/livedoor.gif","title":"livedoor \u5929\u6c17\u60c5\u5831","height":26}},"title":"\u6771\u4eac\u90fd \u6771\u4eac \u306e\u5929\u6c17","description":{"text":" \u524d\u7dda\u304c\u4f0a

こういった文字列がブラウザに表示されると思います。(長いため、一部割愛しています)

ごちゃごちゃといっぱい文字が書かれていたり、文字コードが違っていたりでよく分からないと思いますが実は天気情報が表示されています。

{'pinpointLocations': [{'link': 'http://weather.livedoor.com/area/forecast/2520101', 'name': '大津市南部'}, {'link': 'http://weather.livedoor.com/area/forecast/2520400', 'name': '近江八幡市'}, {'link': 'http://weather.livedoor.com/area/forecast/2520600', 'name': '草津市'}, {'link': 'http://weather.livedoor.com/area/forecast/2520700', 'name': '守山市'}, {'link': 'http://weather.livedoor.com/area/forecast/2520800', 'name': '栗東市'}, {'link': 'http://weather.livedoor.com/area/forecast/2520900', 'name': '甲賀市'}, {'link': 'http://weather.livedoor.com/area/forecast/2521000', 'name': '野洲市'}, {'link': 'http://weather.livedoor.com/area/forecast/2521100', 'name': '湖南市'}, {'link': 'http://weather.livedoor.com/area/forecast/2521300', 'name': '東近江市'}, {'link': 'http://weather.livedoor.com/area/forecast/2538300', 'name': '日野町'}, {'link': 'http://weather.livedoor.com/area/forecast/2538400', 'name': '竜王町'}], 'link': 'http://weather.livedoor.com/area/forecast/250010', 'forecasts': [{'dateLabel': '今日', 'telop': '曇り', 'date': '2019-09-13', 'temperature': {'min': None, 'max': {'celsius': '26', 'fahrenheit': '78.8'}}, 'image': {'width': 50, 'url': 'http://weather.livedoor.com/img/icon/8.gif', 'title': '曇り', 'height': 31}}, {'dateLabel': '明日', 'telop': '晴時々曇', 'date': '2019-09-14', 'temperature': {'min': {'celsius': '22', 'fahrenheit': '71.6'}, 'max': {'celsius': '29', 'fahrenheit': '84.2'}}, 'image': {'width': 50, 'url': 'http://weather.livedoor.com/img/icon/2.gif', 'title': '晴時々曇', 'height': 31}}, {'dateLabel': '明後日', 'telop': '晴時々曇', 'date': '2019-09-15', 'temperature': {'min': None, 'max': None}, 'image': {'width': 50, 'url': 'http://weather.livedoor.com/img/icon/2.gif', 'title': '晴時々曇', 'height': 31}}], 'location': {'city': '大津', 'area': '近畿', 'prefecture': '滋賀県'}, 'publicTime': '2019-09-13T11:00:00+0900', 'copyright': {'provider': [{'link': 'http://tenki.jp/', 'name': '日本気象協会'}], 'link': 'http://weather.livedoor.com/', 'title': '(C) LINE Corporation', 'image': {'width': 118, 'link': 'http://weather.livedoor.com/', 'url': 'http://weather.livedoor.com/img/cmn/livedoor.gif', 'title': 'livedoor 天気情報', 'height': 26}}, 'title': '滋賀県 大津 の天気', 'description': {'text': ' 近畿地方は、気圧の谷や湿った空気の影響でおおむね雨で、南部では雷を伴った激しい雨の降っている所があります。\n\n 今日の滋賀県は、気圧の谷や湿った空気の影響でおおむね曇り、夕方まで雨の降る所があるでしょう。\n\n 明日の滋賀県は、高気圧に覆われておおむね晴れる見込みです。', 'publicTime': '2019-09-13T10:32:00+0900'}}

文字コードを整えるとこうなります。

よく見ると『曇り』とか天気っぽい単語が見つけられますね。

このように『URL』を利用して『Web API』ではデータのやり取りを行います。

知っている方には当然のことだったとは思いますが、知らない方にとってはちょっと驚きだったかなと思います。
(自分が初心者の頃は、もっと自分に馴染みのないものを利用してデータのやり取りを行っていると思っていました。)


REST API とは?

さて、それでは本題の『REST API』について説明したいと思います。

かなり専門的な用語がでてきますので、今の段階でお腹一杯の方は一度休憩することをお勧めします。

REST(休息)を取ると頭もスッキリして理解が進むかもしれません。

…はい、つまらない冗談は置いておいて話を進めたいと思います。


まずは端的に『REST API』を説明します!

『REST API』とは外部に提供するために整えられたWeb APIのことです。

APIもWeb APIも広い意味だったのでなかなか理解が難しかったと思いますが、この『REST API』はたったこれだけです。

このうちの『外部に提供するために整えられた』というところが『REST』にあたります。

『REST』というのは『rest』ではなく『REpresentational State Transfer』の略です。直訳すると『表現可能な状態の転送(やりとり)』で、つまり『表現可能な状態』=『画像や文字データ』の『転送(やりとり)』という意味だそうです。

…はい、よくわからないので噛み砕いていきます。

具体的に、下記の4つのことを『REST』と呼びます。

  1. セッションなどの状態管理を行わない。(やり取りされる情報はそれ自体で完結して解釈することができる)
  2. 情報を操作する命令の体系が予め定義・共有されている。(HTTPのGETやPOSTメソッドなど)
  3. すべての情報は汎用的な構文で一意に識別される。(URLやURIなど)
  4. 情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができる。

またまた難しいのでひとつずつ解説していきます。

1.セッションなどの状態管理を行わない

Webサイトに訪れると、みなさんに『セッション』というものが与えられます。
この『セッション』を元に、みなさんがそのサイトで何をしたのかを管理するのですが、『REST』ではこのセッションなどでの状態管理は行わないのが原則となります。

『何をしたのか』という『足跡』を残さないっていうイメージですね。

『足跡』が残らないというのは、逆に言えば一回のやり取りで完結します。これはどちらかというとサーバーに負荷をかけないためのものなので、そういうものなのかという程度で問題ないです。

2.情報を操作する命令の体系が予め定義・共有されている

難しく書いてありますが、実は簡単です。

HTTP通信にはいくつか種類があります。代表的なモノとしては『GET』と『POST』というものがあります。『GET』はURLを利用しデータのやり取りをし、『POST』はURLは使用せずにデータのやり取りを行います。(後に詳しく解説します。)

『いくつか存在するHTTP通信のどれを使うのかをはっきり決めて、みんなに教えなさい!』

ということです。作りっぱなしはダメですよね。

3. すべての情報は汎用的な構文で一意に識別される

また難しい日本語で書いてありますね…

これはデータを手に入れる時に使用する『URL』は『分かりやすく』かつ『なるべくコンパクトにまとめる』ということを言います。

例えば、悪い例としてよくあげられていますが

新規ユーザーに関するAPIで

  • /CreateUser => 新規ユーザー作成
  • /UpdateUser => ユーザー情報の更新
  • /DeleteUser => ユーザー情報の削除

などのように何かをするたびにURLを作成するのは良くないです。数が少なければ気になりませんが、多くなると煩雑になります。

RESTの考えだと

  • /UserInfo

というURLを1つだけ用意して、通信方法が『GET』であれば『新規ユーザー作成』、『POST』であれば『ユーザー情報の更新』のように『通信方法』で区別します。

4.情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができる

これはデータのやり取りができるようにする、というだけです。

サービスによっては、ユーザーがパスワードのようなものを送らないといけないので、使用方法は確認しましょう。

また、データに関しては一般的に使用される形式にするとみんなが使えてハッピーです。


その他色々あるのですが、基本的にはどのように『設計』するのかという考え方なのでここまでにしておきます。

これで『REST API』がどのようなものでどのように作られるのかというのが分かったと思います。

逆に言えば、どのように使用すればいいのかもなんとなくわかったと思います。

それでは、最後に『REST API』を使用する場合に必要なモノを挙げたいと思います。

  1. URL(主に http://~ or https://~ )
  2. 通信方法(主にGET or POST)
  3. 送信データ(例えば、ユーザー情報など)

この3つを把握さえしていれば、『REST API』を使用するのは難しくありません。

それでは、ご覧いただきありがとうございました。