私は普段、Androidアプリの開発業務に携わっています。
とある日の業務で、サーバサイドの調査を行う機会がありました。
そこで理解が浅いと感じ、今回は調べてみたことをまとめてみました。
![サバ缶](https://tech-begin.com/wp-content/uploads/2021/08/cropped-profile_icon.png)
いっしょに基礎から、
1つずつ理解していきましょう!
RESTとは
RESTは、英語で「REpresentational State Transfer」と書きます。
日本語に訳すると「代表的な情報転送」という意味になります。
要するに、デファクトスタンダード(広く普及した)となったWebインフラを活用して、Webサービスに簡単にアクセス可能にする仕組みのことです。
仕様ではなく、WebAPIの仕様を決めていく中で基本となる考え方(概念)にあたるので要注意。
RESTの設計思想
下記の4つの設計思想(考え方)で作られたインターフェースを「REST API」と呼びます。
HTTPリクエストを受け付けるインターフェースとなります。
Stateless
ステートレス。つまり、状態を持たない(維持しない)ことを意味します。
セッションなどの情報管理を行わず、通信の情報は単体で完結します。
要するに、個々のHTTPリクエストが完全に分離しているということです。
ステートレスとは、処理に必要な情報を一度に詰め込んでリクエストを投げることです。
![RESTのステートレス図解](https://tech-begin.com/wp-content/uploads/2023/09/RESTのステートレス図解.png)
自己完結型なタイプですね。
![](https://tech-begin.com/wp-content/uploads/2022/07/OL風の人物アイコン.png)
こういうタイプの人って、
ちょっと気難しくて苦手なのよね。
![サバ缶](https://tech-begin.com/wp-content/uploads/2021/08/cropped-profile_icon.png)
ちょっ、主観を言わないの!
とはいえ、実社会では『ステートフル』な人の方がコミュニケーション取りやすいです。
以下のように、会話に近いやり取りがステートフルと呼べます。
![RESTのステートフル図解](https://tech-begin.com/wp-content/uploads/2023/09/RESTのステートフル図解.png)
前の情報(ステート・状態)を保持したまま会話(通信)が進んでいますね。
ここで、それぞれのメリットとデメリットを整理しておきましょう。
- ステートレス🧊
- メリット
- 一度にリクエストの内容を受け取れるため、クライアントの状態を気にしなくていい。
- 言い換えると、常にデータ操作に必要なデータが揃っている状態になる
- デメリット
- 不要なデータが乗っかる場面もあるため、冗長になるケースがある。
- 一度にリクエストパラメータを受け取るため、どこの値でエラーが起きたのかなど解析が難しいことがある
- メリット
- ステートフル🔥
- メリット
- やり取りが簡潔なので、ネットワーク帯域の節約になる
- デメリット
- クライアントの状態(ステート)を把握しておかなければならないため、サーバ負荷が増えがち。
- システム拡張する際、サーバを増設したらクライアントの状態(ステート)を同期しなければならない。
- メリット
どちらも一長一短ですが、REST APIにおいてはステートレスが採用されているのでご注意ください。
Uniform Interface
「均一なインターフェース」という意味です。
情報の操作は、HTTPメソッドで指定して実行します。
- 取得(GET)
- 作成(POST)
- 更新(PUT)
- 削除(DELETE)
データベースの操作「CRUD」と対比されることが多いです。
![RESTのUniformInterface図解](https://tech-begin.com/wp-content/uploads/2023/09/RESTのUniformInterface図解.png)
※厳密にはPOSTはCRUDに対応していません。
Addressability
「アドレス指定能力」という意味の言葉です。
全てのデータやリソースは、識別するための一意のURL定義を持っています。
アドレス指定可能なURIで公開されているということですね。
提供する全ての情報は、URIで表現される一意(1つしかない)なアドレスを保持します。
以下は、ウェザーニュースのAPIのひとつ。
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/f1f3c97e9b87e14a59eaa5051c145f45.jpg)
こんな感じに、アドレス指定することができることを「Addressability」といいます。
Connectability
「接続性」という意味です。
アプリケーションの「情報」と「状態遷移」の両方を扱えます。
単純に、あるリソースから他のリソースへのリンクを含めることができます。
まとめ
REST は以下のような決まり事から成り立っていることがわかりました。
- Stateless
- Uniform Interface
- Addressability
- Connectability
機能ではなく、概念なので様々な言語に適合することができます。
この概念を理解した上で、APIの作成を進めていけばRESTfullな設計ができるはずです。
参考文献
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9UkVTVCVFNSU4NSVBNSVFOSU5NiU4MCUyMCVFNSU5RiVCQSVFNyVBNCU4RSVFNyU5RiVBNSVFOCVBRCU5OCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9YTEzZThhYzU0NGQ0YzY2MmIyMDllZmJiMDNjMmVhNDQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwVGFrYWhpUm95dGUmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWEyNWQ4NWQyMDk1ZDMzMDUwZjY3MTViNTdjNWE4Njg2&blend-x=142&blend-y=491&blend-mode=normal&s=20e584db0abe542bc9d3cc8803703c10)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9UkVTVCUyMEFQSSVFMyU4MiU4NCVFMyU4MiU4OU9EQVRBJTIwQVBJJUUzJTgyJTg0JUUzJTgyJTg5QURPJUUzJTgyJTg0JUUzJTgyJTg5U3dhZ2dlciUyMCVFMyU4MiU4NCVFMyU4MiU4OVNPQVAlMjBBUEklRTMlODIlODQlRTMlODIlODlHcmFwaFFMJUUzJTgyJTg0JUUzJTgyJTg5Z1JQQyVFMyU4MiU4NCVFMyU4MiU4OSVFMyU4MCU4MiVFMyU4MCU4MiVFMyU4MCU4MiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9NDdhYmFjNWM1NGFhNTI3NjdiY2NlNTdhNzI5MzgwMTQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwVGVycnkzJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0zMGE1NmM5MTJhYzAzZDEwN2E1YmVkYzgxMTI2YTYwYQ&blend-x=142&blend-y=491&blend-mode=normal&s=b0c9e831cd2721b790a101a9021132a2)
![](https://tech-begin.com/wp-content/uploads/cocoon-resources/blog-card-cache/826ddd244d633277d168b815aaa15114.png)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9UkVTVCVFNSU4NSVBNSVFOSU5NiU4MCUyMCVFNSU5RiVCQSVFNyVBNCU4RSVFNyU5RiVBNSVFOCVBRCU5OCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1jbGlwPWVsbGlwc2lzJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9YTEzZThhYzU0NGQ0YzY2MmIyMDllZmJiMDNjMmVhNDQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwVGFrYWhpUm95dGUmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWEyNWQ4NWQyMDk1ZDMzMDUwZjY3MTViNTdjNWE4Njg2&blend-x=142&blend-y=491&blend-mode=normal&s=20e584db0abe542bc9d3cc8803703c10)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9JUUzJTgyJUI5JUUzJTgzJTg2JUUzJTgzJUJDJUUzJTgzJTg4JUUzJTgzJUFDJUUzJTgyJUI5JUUzJTgxJUE4JUUzJTgxJUFGJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1lMjc5NjJmN2I1Zjg2NzNkOTU0MTdlZmZjM2NhNWM0MA&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwbXRha2VoYXJhMjEmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTAwYjEzNWJjZGUxZjI3Yzc2NDE1YjlhNjcyZWVlNjhk&blend-x=142&blend-y=491&blend-mode=normal&s=7ddb448dee72e771c66c92b73bdee38b)