APIってどうつくればいいの？


初心者が初心者のために書く記事です。
なので細かい部分で勘違いやミスがあることをご留意くださいませ...。
もしこのミスはやばいだろ！とかありましたら指摘してくれると私とこの記事を読む人のためになります。
## まずAPIってなんなの
**API**は**Application Programming Interface**の略称です。
インターフェースというくらいですから、アプリケーションのプログラムとプログラムをつないでくれるんだろうなというのがくみ取れます。
実際の例を挙げると、DeepLのAPIに適当な日本語の文字列を送ると、英語になって返ってきます。
関数みたいですね。まあやっていることは大体一緒です。
一番違うのは、誰かが用意してくれていてその機能を使っていいよっていう部分です。
そしてその機能はプログラミング言語や環境などに左右されないというところが強いです。
とっても便利ですね！
そういったAPIをネットワークを利用して提供してくれるものを**WebAPI**といい、それをサーブ(提供)しているものがAPIサーバーっていうんですね。(筆者はAPIサーバーがAPIそのもの？とか混乱していました。)
## 意味が分かったところで実際に使ってみる
 **Random User Generator**というサイトで提供されているAPIをたたいてみましょう。
 お好きなターミナルを開いてこのコマンドを打ってみてください。
```
curl https://randomuser.me/api
```
**curl**コマンドはhttpリクエストを送ることができるコマンドです！
>**jq**コマンドも使えると便利かも。
>[youtube「開発効率爆上がり curl + jq コマンド入門講座」](https://www.youtube.com/watch?v=-HohpQP-lwU)

んで実際にたたいてみるとこんな値が。
```
{
  "results": [
    {
      "gender": "female",
      "name": {
        "title": "Mrs",
        "first": "Katarina",
        "last": "Vidaković"
      },
      "location": {
        "street": {
          "number": 1895,
          "name": "Ostružnička"
        },
        "city": "Gornji Milanovac",
        "state": "Bor",
        "country": "Serbia",
        "postcode": 40321,
        "coordinates": {
          "latitude": "56.9457",
          "longitude": "77.3986"
        },
        "timezone": {
          "offset": "+3:30",
          "description": "Tehran"
        }
      },
      "email": "katarina.vidakovic@example.com",
      "login": {
        "uuid": "6ea93940-5cd8-4fc8-b0d0-f05a449a8b1c",
        "username": "beautifulzebra115",
        "password": "slim",
        "salt": "X1H7WIBb",
        "md5": "9b34e53a14ebdd82ded1d11d80691f14",
        "sha1": "7a6e2dc88ab090ac8ed9c472ff9ccf27dc778577",
        "sha256": "18f43d1c2ca628da8da417ec1058960e99c1fab68e207ec70645dbee678819ce"
      },
      "dob": {
        "date": "1965-08-31T05:16:41.576Z",
        "age": 58
      },
      "registered": {
        "date": "2015-04-25T10:20:11.986Z",
        "age": 9
      },
      "phone": "016-6571-703",
      "cell": "064-9883-142",
      "id": {
        "name": "SID",
        "value": "254733221"
      },
      "picture": {
        "large": "https://randomuser.me/api/portraits/women/27.jpg",
        "medium": "https://randomuser.me/api/portraits/med/women/27.jpg",
        "thumbnail": "https://randomuser.me/api/portraits/thumb/women/27.jpg"
      },
      "nat": "RS"
    }
  ],
  "info": {
    "seed": "a791eb373d7e783d",
    "results": 1,
    "page": 1,
    "version": "1.4"
  }
}
```
って感じに文字列が返ってきます。
これはjson形式と呼ばれる文字列の並び方です。
jsonはただの文字列の並べ方なので怖くないです。
この形式にのっとっているとプログラムで書くときにライブラリとかでサポートされていることが多くてうれしいです。
こんな感じでAPIというものはたたきます。

## プログラムに落とし込んでみる
ってことで実際にプログラムを書いてみます。
どの言語で書いてみるのが分かりやすいのだろうか。
<details open><summary>Python</summary>

requestsライブラリをインストールしてください
お好きなターミナルで以下を実行してください

```terminal.
pip install requests
```
以下のコードをコピペしたファイルを用意してください。

```request.py
import requests

response = requests.get('https://randomuser.me/api')
print(response.text)
```
ここまで出来ましたらターミナルで実行！
この時、ターミナルはファイルがある場所にあることに注意！
```
py request.py
```

これで文字がいっぱい出てきたら成功です！
</details>
<details open><summary>Go</summary>

go mod initでgo.modファイルを作り、tidyで依存関係を解決して実行してください
お好きなターミナルで以下を実行してください

```terminal.
go mod init nandemoii
go mod tidy
```

以下のコードをコピペしたファイルを用意してください。

```request.go
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	resp, err := http.Get("https://randomuser.me/api")
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	defer resp.Body.Close()

	body, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println(string(body))
}

```
ここまで出来ましたらターミナルで実行！
この時、ターミナルはファイルがある場所にあることに注意！
```
go run .
```
これで文字がいっぱい出てきたら成功です！
</details>

なにやっているかというと、プログラム内でHTTPリクエストというものをAPIサーバーに送っています。そうするとさっきターミナルで叩いたみたいにjson形式の文字列が返ってきてそれをプリントしているだけですね。

他の言語で試してみたかったら多分　”言語”　HTTPリクエスト　GET　とかで調べると簡単なコードとか出てくると思います。
ここまでできればあとはなんでもし放題ですね。
言語によってはjson形式をいい感じに触れる機能が備わっているので検索してみてください。
この辺が楽しいと思えた人はほかにも**HTTPメソッド**と呼ばれるGETやPOSTについて調べてみると楽しいかもしれません。
>簡単にHTTPメソッドについて説明します
>APIサーバーになにかデータを送って、それによった結果のデータが欲しい、がPOST。
>データは送らないけどデータください、がGET。
>ほかにもPUT,PATCH、DELETEとかいろいろあるよ。
>最初はGETとPOSTくらいわかってれば十分じゃないかな？

## APIサーバーってどんな風に作られてるの？
簡単です。
<details open><summary>Python</summary>
今回はfastAPIというライブラリを使っていきます。
名前の通り素早く簡単なAPIサーバーを作れます！
ってことでインストール

```
pip install fastAPI
```
できたら以下のファイルを作成してください。
```server.py
from fastapi import FastAPI, Request

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "練習用のAPIです。"} 

@app.post("/items/")
async def create_item(request: Request):
    data = await request.json()
    a = data.get("a")
    b = data.get("b")
    return a + b

```
コード書けましたら、ターミナルで以下のコマンドをたたきます。
この際、ターミナルの位置はpythonファイルがあるところでたたきます。

```
uvicorn server:app --reload
```
上記のコマンドはmainの部分をあなたのpythonファイルの名前です。
そこまでできてなんかいい感じに文字が出てきましたら、APIサーバーの完成です！
実際に先ほど練習したようにcurlコマンドを打ってみましょう。
urlは [http://localhost:8000](http://localhost:8000) というところになります。
別のターミナルを開いて以下のコマンドをターミナルで実行！

```
curl  http://127.0.0.1:8000/items/
```

```
curl -X POST http://127.0.0.1:8000/items/ -H "Content-Type: application/json" -d '{"a": 5, "b": 3}'
```

それぞれそれっぽい値が返ってきたら成功です！
もうAPIサーバー作ったことあるよって言えます！！！
お疲れさまでした！
</details>

<details open><summary>Go</summary>

今回はechoフレームワークを使います。
もちろんフレームワークを使わなくても書けますが、簡単なので今回はこれを使います。
とりあえず下記のコードをコピペしたファイルを作ってください。
こちらは本当に最低限動くものを書いています。
```main.go
package main

import (
	"net/http"

	"github.com/labstack/echo/v4"
)

func main() {
	e := echo.New()

	e.GET("/", hello)
	e.POST("/items", createItem)

	e.Logger.Fatal(e.Start(":8000"))
}

func hello(c echo.Context) error {
	response := map[string]string{
		"message": "練習用のAPIです。",
	}
	return c.JSON(http.StatusOK, response)
}


type data struct {
		A int `json:"a"`
		B int `json:"b"`
	}


func createItem(c echo.Context) error {
	var data data
	if err := c.Bind(&data); err != nil {
		return err
	}
	result := data.A + data.B
	return c.JSON(http.StatusOK, map[string]int{"result": result})
}

```
きっとimport文でエラーが起きていると思いますが、
そしたらターミナルでそのファイルがある場所で
```
go mod init sample.com
go mod tidy
```
を実行して依存関係を解消してください！
エラーが消えましたら、実行してください。

```
go run .
```
起動できましたらAPIサーバーの完成です！
実際に先ほど練習したようにcurlコマンドを打ってみましょう。
urlは [http://localhost:8000](http://localhost:8000) というところになります。




```
curl http://127.0.0.1:8000/
```

```
curl -X POST http://127.0.0.1:8000/items/ -H "Content-Type: application/json" -d '{"a": 5, "b": 3}'
```

それぞれそれっぽい値が返ってきたら成功です！
これで、APIサーバーを作成したことがありますよと言えます！
お疲れさまでした！

</details>

## APIのいろいろ
今回はほんとに簡単なAPIのサーブ側と受け取り側をやってみたわけですが、実際にはAPIサーバーの形式などがあります。
例えば**REST**や**GraphQL**、**gRPC**などあります。
簡単なAPIを書いてみて、もっと大きなサービスを作りたいよ！ってなったら調べてみてください。
また、今回はGETして用意されている文字列を受け取ったり、数字二つをPOSTして合計の値を返してもらったわけですが実際は自分のPC上で動かせないような値を受け取ることや、**データベース**に保存されている値を取得、逆に保存したりします。なので、今回勉強したことを活かすために次はデータベースを勉強してみても面白いかもしれません。
また、多分知らないことやわからないところをできるだけ説明してきたつもりですが、ぜひ調べてみてください。
ほかにも、さまざまなAPIサーバーが世の中にはあるわけでして、面白いものを探すことも楽しいです。このサイト、API用意してないかな？とか考えながらブラウジングしてみても面白いと思います。ぜひ、"API 面白い　便利"みたいな感じで検索してみてください。
ってことで次はデータベースの作成かつRESTを用いたAPIサーバーでも作ってみようと思います。