初心者が初心者のために書く記事です。
なので細かい部分で勘違いやミスがあることをご留意くださいませ...。
もしこのミスはやばいだろ!とかありましたら指摘してくれると私とこの記事を読む人のためになります。
まず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 コマンド入門講座」
んで実際にたたいてみるとこんな値が。
{
"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というものはたたきます。
プログラムに落とし込んでみる
ってことで実際にプログラムを書いてみます。
どの言語で書いてみるのが分かりやすいのだろうか。
Python
requestsライブラリをインストールしてください
お好きなターミナルで以下を実行してください
pip install requests
以下のコードをコピペしたファイルを用意してください。
import requests
response = requests.get('https://randomuser.me/api')
print(response.text)
ここまで出来ましたらターミナルで実行!
この時、ターミナルはファイルがある場所にあることに注意!
py request.py
これで文字がいっぱい出てきたら成功です!
Go
go mod initでgo.modファイルを作り、tidyで依存関係を解決して実行してください
お好きなターミナルで以下を実行してください
go mod init nandemoii
go mod tidy
以下のコードをコピペしたファイルを用意してください。
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 .
これで文字がいっぱい出てきたら成功です!
なにやっているかというと、プログラム内でHTTPリクエストというものをAPIサーバーに送っています。そうするとさっきターミナルで叩いたみたいにjson形式の文字列が返ってきてそれをプリントしているだけですね。
他の言語で試してみたかったら多分 ”言語” HTTPリクエスト GET とかで調べると簡単なコードとか出てくると思います。
ここまでできればあとはなんでもし放題ですね。
言語によってはjson形式をいい感じに触れる機能が備わっているので検索してみてください。
この辺が楽しいと思えた人はほかにもHTTPメソッドと呼ばれるGETやPOSTについて調べてみると楽しいかもしれません。
簡単にHTTPメソッドについて説明します
APIサーバーになにかデータを送って、それによった結果のデータが欲しい、がPOST。
データは送らないけどデータください、がGET。
ほかにもPUT,PATCH、DELETEとかいろいろあるよ。
最初はGETとPOSTくらいわかってれば十分じゃないかな?
APIサーバーってどんな風に作られてるの?
簡単です。
Python
今回はfastAPIというライブラリを使っていきます。 名前の通り素早く簡単なAPIサーバーを作れます! ってことでインストールpip install fastAPI
できたら以下のファイルを作成してください。
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 というところになります。
別のターミナルを開いて以下のコマンドをターミナルで実行!
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サーバー作ったことあるよって言えます!!!
お疲れさまでした!
Go
今回はechoフレームワークを使います。
もちろんフレームワークを使わなくても書けますが、簡単なので今回はこれを使います。
とりあえず下記のコードをコピペしたファイルを作ってください。
こちらは本当に最低限動くものを書いています。
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 というところになります。
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サーバーを作成したことがありますよと言えます!
お疲れさまでした!
APIのいろいろ
今回はほんとに簡単なAPIのサーブ側と受け取り側をやってみたわけですが、実際にはAPIサーバーの形式などがあります。
例えばRESTやGraphQL、gRPCなどあります。
簡単なAPIを書いてみて、もっと大きなサービスを作りたいよ!ってなったら調べてみてください。
また、今回はGETして用意されている文字列を受け取ったり、数字二つをPOSTして合計の値を返してもらったわけですが実際は自分のPC上で動かせないような値を受け取ることや、データベースに保存されている値を取得、逆に保存したりします。なので、今回勉強したことを活かすために次はデータベースを勉強してみても面白いかもしれません。
また、多分知らないことやわからないところをできるだけ説明してきたつもりですが、ぜひ調べてみてください。
ほかにも、さまざまなAPIサーバーが世の中にはあるわけでして、面白いものを探すことも楽しいです。このサイト、API用意してないかな?とか考えながらブラウジングしてみても面白いと思います。ぜひ、"API 面白い 便利"みたいな感じで検索してみてください。
ってことで次はデータベースの作成かつRESTを用いたAPIサーバーでも作ってみようと思います。