Help us understand the problem. What is going on with this article?

Fラン文系でもわかるプログラミング〜RESTful API〜

More than 1 year has passed since last update.

はじめに

はじめまして。
社会人2年目、プログラミング歴も2年目の文系出身新米エンジニアです。
先日ネットの記事を読んでいたら、『アウトプット駆動開発』という言葉を目にしました。
ここではこの言葉の意味に深くは触れませんが、要は「エンジニアの勉強はよそ様に見せてなんぼじゃ!」みたいな考え方のようです。
素晴らしい考え方ですね。とっても感銘を受けました。(小並感)
こんなに素敵な記事を読んで、じっとしているわけにはいかないですね。
「こうしちゃおれん!!」と自分もアウトプットしてみた次第です。
間違っていること、こうした方がいいよ!なんてことがあれば、どしどしコメントください。

今回は、たまたま目に止まった「RESTful API」という言葉についてです。

RESTful APIとは?

RESTの決まりに従ったAPIのことです。
fulはpowerfulやbeautifulなんかのfulですね。
つまり、「RESTらしいAPI」のことを、RESTfulAPIというみたいです。

では、RESTとは一体なんなのでしょうか。
みんな大好きIT用語辞典には、こんな風に書いてあります。

REST 【 REpresentational State Transfer 】
RESTとは、2000年にRoy Fielding氏が提唱した、分散システムにおいて複数のソフトウェアを連携させるのに適した設計原則の集合。
また、狭義には、それをWebに適用したソフトウェアの設計様式のこと。一般には後者の意味で用いられることがほとんどである。

...なんのことだかわかりませんね。詳しく解説いたします。

RESTとは

RESTとはWebサービスの設計モデルの事です。
こうしたら素敵なWebサービスを作れるよ!という先人の教えです。
大きく4つ、このモデルにするための決まりがあります。

1. アドレス指定可能なURIで公開されていること(Addressability)
2. インターフェース(HTTPメソッドの利用)の統一がされていること(Uniform Interface)
3. ステートレスであること(Stateless)
4. 処理結果がHTTPステータスコードで通知されること(Connectability)

この4つを守ることで、RESTfulなAPIは出来上がるようです。だんだんどんな言葉なのかわかってきましたね。
それでは、この4つの決まりがどういう意味なのか、見ていきましょう。

1.アドレス指定可能なURIで公開されていること。(Addressability)

対応するアドレスを入力すれば、そのページが取得できるということです。
例えば、IT用語辞典であれば、「 http://e-words.jp/
というアドレスを入力すれば、一意にこのページを参照することができます。
このような状態のことを「アドレス指定可能なURIで公開されている」いいます。

2.インターフェースの統一がされていること。(Uniform Interface)

インターフェースとは、何かしらのインプットに対して、
何かしらアウトプットを返す仕組みのこと、という風に考えてくださって結構です。

インターフェースの統一がされていること。」とは、リクエストを送る際は、必ずURIとHTTPメソッドを使用する、ということです。
HTTPメソッドには、主に以下のようなものがあります。

- POST:クライアントからのデータの送信
- GET:サーバーからのデータの送信要求
- PUT:データの保存要求
- DELETE:データの削除要求

RESTでは、URIに対して、これらのメソッドを使用する形式をとることが義務付けられています。

3.ステートレスであること(Stateless)

ステートレスとは何か。
調べたところ、何だか有名っぽい例えが出てきたので紹介いたします。
http://yohei-y.blogspot.com/2007/10/blog-post.html
こちらのサイトを参考にいたしました。
許可はいただいておりませんので、問題があれば削除いたします。

クライアント:客 サーバー:店員
ステートフルな例
客: こんにちは
店員: いらっしゃいませ。○○バーガーへようこそ
客: ハンバーガーセットをお願いします
店員: サイドメニューは何になさいますか?
客: ポテトで
店員: ドリンクは何になさいますか?
客: ジンジャーエールで
店員: +50円でドリンクをLサイズにできますがいかがですか?
客: Mでいいです
店員: 以上でよろしいですか?
客: はい
店員: かしこまりました

ステートレスな例
客: こんにちは
店員: いらっしゃいませ。○○バーガーへようこそ
客: ハンバーガーセットをお願いします
店員: サイドメニューは何になさいますか?
客: ハンバーガーセットをポテトでお願いします
店員: ドリンクは何になさいますか?
客: ハンバーガーセットをポテトとジンジャーエールでお願いします
店員: +50円でドリンクをLサイズにできますがいかがですか?
客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします
店員: 以上でよろしいですか?
客: ハンバーガーセットをポテトとジンジャーエール(M)でお願いします。以上
店員: かしこまりました

一見、ステートフルな方がシンプルで良さそうですね。
ですが、それは店員さんがお客さんの注文を覚えていられたら、の話です。

例えば、お客さんがたくさん来店した場合。
ステートフルな例では、
店員さんは、複数のお客さんの相手をしながら、お客さんのそれまでの注文を覚えていなければいけません。
逆に、ステートレスな例では、
お客さんが全ての注文内容を繰り返してくれるため、店員さんはそれまでの注文を覚えている必要はありません。

これをクライアント、サーバーに置き換えると。
ステートフルな場合は、複数のアクセスがあった場合、サーバーにたくさんの負荷がかかってしまいます。
ステートレスな場合は、複数のアクセスがあっても、URIに全ての情報が入っているため、サーバーに負荷がかからない、という利点があります。

ただ、ステートレスな場合は送信する情報が多くなってしまうので、
サーバーのスケーラビリティと、送信する情報量のトレードオフになります。
メリット、デメリットを意識して、どちらをどれくらいとるか考えるのが重要なようです。

4.処理結果がHTTPステータスコードで通知されること(Connectability)

HTTPステータスコードとは、HTTPレスポンスの種類を番号とメッセージで示したもののことです。
主に、以下のようなものがあります。

ステータスコード 意味
200 OK リクエストが正常に処理された
404 Not Found 要求されたリソースはサーバーに存在しない
403 Forbidden 要求されたリクエストは拒否された
500 Internal Server Error サーバーでエラーが発生した

リクエストの結果が、これらのステータスコードで表現されることが、RESTでは定められいます。

まとめ

以上のような規則に則ったサービスの事をRESTful APIと言うと、私は解釈しています。
RESTが、そもそもWeb設計の考え方の一つという、割合ふわっとしたものなので、
実態が掴みづらいところがありますが、理想のWebサービスのあり方、とでも捉えておけば良さそうな気がします。
以上、RESTful APIのまとめでした。

参考

http://e-words.jp/
http://yohei-y.blogspot.com/2007/10/blog-post.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away