Getting Started

2019/10/4

REST API とは?

どうも、こんにちは!JellyWareです。

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

このシリーズは、Riiiverやプログラミングを学び、初心者の方でもEco-Drive Riiiverを活用したオリジナルアプリを理解して作れるようになることを目指します。

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

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

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


目次


APIとは?

まずは、API について説明します。API とは、「Application Programming Interface」の省略です。簡単に日本語にすると、「アプリケーションをプログラミングするためのインターフェース」となります。

「アプリケーション」は、いわゆるアプリやソフトのことです。「プログラミング」とは、そのアプリケーションを制作することです。

それでは、インターフェースとはどういうニュアンスなのでしょうか?

インターフェースとは?

インターフェースとは、コンピュータに関連の用語で「異なるものを仲介する」という意味になります。

例えば、「USBケーブル」もインターフェースの1つです。

USBケーブルを使用することで、「パソコン」と「カメラ」や「スマートフォン」などを接続することができます。

また、USBケーブルのようにハードとハードを繋げるインターフェースを「ハードウェアインターフェース」と呼びます。

対して、アプリケーションとプログラミングを結び付けるインターフェースを「ソフトウェアインターフェース」と呼び、これが「API」です。

PCやスマホをUSBケーブルが繋げるように、異なるアプリケーションをAPIを活用することで繋げることができます。

APIの公開

全てのアプリケーションがAPIで繋げられるわけではありません。

挿し口が無いとUSBケーブルで接続することができないように、前提として「APIを公開する」必要があります。

「APIを公開する」ことで、公開した相手がアプリケーションを繋げることができます。

その際に、どこまで繋げることができるかは、その制作者側が決定します。アプリケーション全ての機能と連携できるAPIもあれば、一部しか連携できないAPIもあります。


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つとなります。

Web APIというのは、「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 API」とは外部に提供するために整えられたWeb APIのことです。

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

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

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

具体的に、下記の4つのことを REST と呼びます。(IT用語辞典「e-Words」 より引用)

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

ひとつずつ解説していきます。

セッションなどの状態管理を行わず、やり取りされる情報はそれ自体で完結して解釈することができる

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

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

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

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

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

このHTTPに則り、通信を行うことを意味します。つまり、一般的な手法を使用するということになります。

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

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

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

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

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

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

RESTの考えだと

  • /UserInfo

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

情報の一部として、別の状態や別の情報への参照を含めることができる

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

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

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


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

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

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

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

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

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

ご覧くださいましてありがとうございました。