APIについてまとめ

APIについての知識が弱いので改めて学習しました。
認識間違っている部分あったら是非教えてください。

> 参考にさせてもらったサイト：
> https://www.itmanage.co.jp/column/application-programming-interface/
> https://data.wingarc.com/what-is-api-16084
> https://tech.012grp.co.jp/entry/rest_api_basics
> https://dog.ceo/dog-api/
> https://www.redhat.com/ja/topics/api/what-is-graphql

APIとは？ 
---------------------------------------

・Application Programming Interfaceの略。
・接続先のOSを呼び出すことや互いのソフトウェアやアプリケーションの一部を共有する接続口。
・一からデータベースを作ったりしなくても、欲しい情報だけ取ってこれる、別のサービスが出している機能を使うことができる、別サービスで使っているアカウントでログイン認証ができるなど、非常に便利。

https://dog.ceo/dog-api を参考にすると、
犬の画像がたくさん入っているデータを公開しているwebアプリ（ https://dog.ceo/dog-api ）があって、サイト内に記載されているURLを張り付ける事で、その中にある犬の画像を自分のwebサイトで呼び出すことができる。このURLの部分がAPI。


Web API
---------------------------------------
web APIとAPIって何が違うのか？

 web APIとはインターネット上で公開されているwebサービスを呼び出すのに使われており、
__HTTP・HTTPS通信によってやり取りするAPI__。プログラミング言語が違っているもの同士もやり取りすることができる。別名クラウドサービスと言われている。
https://dog.ceo/dog-api がまさにこれかな？

APIの種類にはweb API以外に、
ネイティブAPI、ランタイムAPI、ライブラリAPI、データベースAPIなど多岐にわたり、
APIという大きなくくりの中にweb APIが存在するイメージ。

web APIの種類
---------------------------------------
webで利用できるものと非公開にされているものがある。

#### Open API
・アプリケーションにある機能・データを他のアプリケーションから呼び出して利用するための接続が可能で、他の企業にも公開されているもの。
例：Twitter API、郵便局が出している住所と郵便番号を結びつけたものなど

#### Partner API
ユーザ登録などすると使える、一部の人にだけ公開されるAPI。
例：Selling Partner API

#### Closed API
企業やグループ内で利用したり、業務提携をしているパートナー企業内で業務用に限定されて利用することが多いAPI。

#### Composite API
一つのAPI連携で、複数のWebアプリケーションや他のAPIにアクセスできる。
jiraやConfluenceを利用するとそれぞれを連携したりできるけど、これに該当するのかな？


通信手段（プロトコル）
---------------------------------------
REST APIとSOAP APIってよく聞くけど、違いが分かっていないので調べた。

REST APIとは？
---------------------------------------
REST APIとは「Representational State Transfer」の原則に基づいて設計されたAPI。
この時点でなんのこっちゃって感じだけれども、
APIという接続口を使う際に、「REST」という4つのルールを守っている＝REST APIということらしい。
「REST」というのは概念？思想的なことを指していて、「RESTful API」とも呼ばれる。
「REST」＝「REST API」＝「RESTful API」という認識が多い印象。

4つのルールって何なのか？
・統一インターフェース
・アドレス可能性
・接続性
・ステートレス性

##### ・統一インターフェース
あらかじめ決められた方法でデータをやり取りしようということ。
HTTPで定義されている "GET"、"POST"、"PUT"、"DELETE" のどれかを使うことが決まっている。

##### ・アドレス可能性
全ての情報がURIで表現されること。「 https://dog.ceo/api/breeds/image/random 」とかまさにデータがURIで表現されていて、このURIを開くとjson形式にデータが入っている。

##### ・接続性
やりとりされる情報にはハイパーリンクを含めること。一つのリンクから別のリンクに異動することができるので、データのやり取りがスムーズになる。

##### ・ステートレス性
ステートレス＝状態・ない＝やり取り（セッション）が残らないので、前のやり取りに影響を受けない。
もしセッションの処理が必要な場合はcookieを利用する。

SOAP APIとは？
---------------------------------------
異なる言語間でのやり取りを可能にするものだけど、セキュリティとデータ通信の面が複雑なプロトコル。
SOAPの代替え手段としてRESTができたくらい。
まとめると
##### REST API
・Representational State Transferの原則に基づいて設計されたAPI
・__HTTPリクエストとレスポンス__ と利用して通信を行う。

##### SOAP API
・__XMLのみ__ を利用し、違う言語同士でも通信ができるもの。
・非常に煩雑なAPI

Graph API・GraphQLとは？
---------------------------------------
 調べていくうちにグラフAPI、GraphQLというものも出てきたので、まとめてみる。
まず、GraphQLとは
https://www.redhat.com/ja/topics/api/what-is-graphql をのぞいてみると下記のように記載されていた。
> GraphQL (グラフキューエル、グラフQL) とは、API (アプリケーション・プログラミング・インタフェース向けのクエリ言語とサーバーサイドのランタイムの両方を指します。GraphQL は、クライアントがリクエストしたデータのみを返すことを優先します。
> 
> GraphQL は、API の速度、柔軟性、開発者にとっての使いやすさを向上させるために設計されました。GraphiQL と呼ばれる統合開発環境 (IDE) にデプロイすることもできます。GraphQL は REST の代わりに、データを複数のデータソースから取得するリクエストを 1 つの API 呼び出しで構成できます。

RESTよりさらに扱いやすいAPIで、複数データの問い合わせを行いたいという場合でも1つだけ呼び出せば良いということらしい。RESTでは関係ない大量のデータを呼び出してしまうことがあるけど、GraphQLでは必要なデータだけを最小限に取り出せる利点がある。

では、Graph APIとはなんなのか？
Graph APIの正式名称は「 __Microsoft Graph API__ 」。
Microsoftが出しているMicrosoft Cloud サービス リソースへのアクセスを可能にする __RESTful Web API__ のこと。

てっきりGraph APIを記述するのに使われているのがGraphQLなんだと思っていたけど、名前が似ているだけで __別物__ だった。（ちょっとややこしい…）


まとめ
---------------------------------------
:::note info
・APIの中にあるweb API
・web APIとは「HTTP・HTTPS通信によってやり取りするAPI」
・web APIの中にSOAP・REST API・GraphQLなどが存在する
・Graph APIはMicrosoftが出している「RESTful Web API」
:::

調べごとすると、次から次へ知らないことが出てくるから止め時がわからなくなりますね。