【備忘録】Web APIとは何か

配属されているプロジェクトでREST APIの実装を担当することになったので、REST APIを理解するうえで前提となる

* そもそもAPIとは何か
* Web APIとは何か

についてまとめました。

# 1. そもそもAPIとは？

APIとは「Application Programming Interface（アプリケーション・プログラミング・インターフェイス）」の略語で、ざっくり言うと、**異なるアプリケーション同士で情報をやり取りする際の橋渡し役**を行うものです。
インターフェイスは、「接点」「境界面」などの意味を持つ英単語です。
参考記事：
https://mintaku-blog.net/api-difference/

# 2. Web APIとは

REST APIとは、Web APIの一種なので、Web APIとは何かについてまとめます。
Web APIとは、**Webブラウザで用いられているHTTP/HTTPSプロトコルを用いて、Webサーバー間で情報をやり取りするAPI**です。
APIにはいろいろな種類があり、例えばWeb API以外には下記のようなものがありますが、情報が多すぎても読みづらくなってしまうので今回は割愛します。

* ネイティブAPI
* ライブラリAPI
* データベースAPI
参考記事：
https://mintaku-blog.net/api-difference/
https://vnext.co.jp/v-blog/what-is-API.html

# 3.Web APIの仕組み
URLとメソッドを指定してWebサーバーにリクエストを送ることで、必要なデータを取得・保存することができます。
具体的には、下記のような仕組みになっています。

![無題のスプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646702/ed8a0be4-cf1b-c83d-a0d9-f51584b5622b.png)

## 3. リクエスト

WebAPIを利用するには、ブラウザを利用するときと同様にHTTP/HTTPSでリクエストを送る必要があります。
その時に必要なのは、下記の2つの情報です。

1. **HTTPメソッド**
2. **URL**

HTTPメソッドは、リクエストによってサーバーに期待するアクションを示したものです。
一般的によく用いられるのは、下記の4つです。
| メソッド | 概要 |
|:-:|:-:|
| GET | データの取得 |
| POST | データの送信（主に新規作成） |
| PUT | データの送信（主に既存データの更新） |
| DELETE | データの削除 |

参考記事：
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods
https://tsuyopon.xyz/2019/01/31/understand-4-http-methods/
URLには、必要に応じてクエリパラメータで引数を渡します。

## 4. レスポンス
リクエストを送ると、Webサーバーがそれに応じて処理を行い、クライアントにレスポンスを返します。
レスポンスとして返ってくるデータは大きく3種類に分けられます。

1. **HTTPステータスライン**
2. **HTTPレスポンスヘッダ**
3. **HTTPレスポンスボディ**

実際にWeb APIの取得時に確認するのはレスポンスボディですが、それぞれについて具体的に見ていきます。

## 4.1 HTTPステータスライン
HTTPリクエストが正常に完了したかどうかを示す、3桁の数字コードのことです。
ステータスコードごとに次のような意味があります。
| ステータスコード | 意味 |
|:-:|:-:|
| 100番台 | 処理中 |
| 200番台 | 処理成功 |
| 300番台 | リダイレクト |
| 400番台 | クライアントエラー |
| 500番台 | サーバーエラー |

参考記事：
https://developer.mozilla.org/ja/docs/Web/HTTP/Status
https://qiita.com/unsoluble_sugar/items/b080a16701946fcfce70

## 4.2 HTTPレスポンスヘッダ
フィールド名：内容で構成されています。
レスポンスボディには書ききれない詳細な情報が詰まっています。
レスポンスヘッダの例：
```
200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY
```

## 4.3 HTTPレスポンスボディ
前述したとおり、Web APIの実行結果を確認するときは、主にこちらを参照します。
データ形式としては、たいていの場合**JSON**を使用します。
下記は、HTTPレスポンスボディの例です。
```
{
  "searchInformation": {
    "totalResults": "289,000,000", 
    "searchTime": "0.35",
    "formattedSearchTime": "0.35 seconds"
  },
  "items": [
    {
      "link": "https://ja.wikipedia.org/wiki/東京",
      "title": "東京 - Wikipedia",
      "snippet": "東京(とうきょう)は、日本の首都。人口約1,397万人(2020年)。東京都の県庁所在地である。関東地方の、本州のほぼ中央に位置する。" 
    },
    { 
      "link": "https://www.city.tokyo.lg.jp/",
      "title": "東京都 | 東京都公式サイト",
      "snippet": "東京都の公式サイト。くらし・手続き、観光・文化、健康・福祉、産業・労働、防災・環境など、東京都の総合的な情報を掲載。"
    },
    ...
  ]
}
```

参考記事：
https://zenn.dev/motokikando/articles/354aeb843cc4dd

## 5. まとめ
* APIとは、異なるアプリケーション間で情報をやり取りするための橋渡し役
* その中でもWeb APIは、HTTP/HTTPSで外部のWebサーバーとやり取りするためのもの
## 6. 参考記事
https://mintaku-blog.net/api-difference/
https://tsuyopon.xyz/2019/01/31/understand-4-http-methods/
https://qiita.com/unsoluble_sugar/items/b080a16701946fcfce70
https://developer.mozilla.org/ja/docs/Web/HTTP/Status
https://developer.mozilla.org/ja/docs/Glossary/Response_header
https://apidog.com/jp/blog/how-to-use-json-in-api-response/