🐡

curlとは何か?Goで作ったローカルAPIを例に仕組みをイメージしてみる

に公開

はじめに

こんにちは!Zenn初投稿になります。
市役所で働きつつ、エンジニアとしての仕事に興味を持ち、現在はGo言語を学んでいます。

Go言語で簡単なAPIを実装したとき、
curlというコマンドを使って
「ちゃんとレスポンスが返ってくるか」を確認しました。

でも、そもそも curl って何なんだ?
正直なところ、全然イメージが湧かないなと思いました。
GPTに「叩いてみて」と言われたから叩いただけ、という状態です。

それではただの作業で意味がありませんよね。

というわけで今回は、
「curlで何が起きているのか」
一番シンプルなローカル環境で整理してみます。

このコミュニティでも、curlに関する記事はたくさんあると思います。
その中で、自分なりの理解を深めるために、
学習メモとして記事にしてみました。

今回の記事のゴールは、以下とします。

curlで叩くと、なぜGoサーバからレスポンスが返ってくるのかを
ローカル環境でイメージできるようになること


今回行ったこと

今回行ったことは、以下の3つです。

  1. Go言語でHTTPサーバを実装する
  2. ターミナルでサーバを起動する
  3. curlを使ってレスポンスを確認する

1. Go言語でHTTPサーバを実装する

まずは、Go言語でHTTPサーバを実装していきます。
今回は、必要最小限の構成にしています。

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "返したよ!")
}

func main() {
	http.HandleFunc("/", handler)

	fmt.Println("サーバ起動: http://localhost:8080")
	http.ListenAndServe(":8080", nil)
}

2. ターミナルでサーバを起動する

ターミナルでサーバを起動します。
以下のコマンドを実行しましょう。

go run main.go

この状態で、サーバは起動したまま待ち受けています。


3. curlを使ってレスポンスを確認する。

次に、curlで確認を行います。
以下のコマンドを別のターミナルで実行しましょう。

curl http://localhost:8080

すると……

レスポンスが返ってきます!

返したよ!

では、ここで疑問です。
curlとは何なのでしょうか?
GPTに一言で聞いてみました。

curl は「コマンドラインからHTTPなどの通信を行い、サーバーにリクエストを送ってレスポンスを確認できるツール」

ほう……
そのまま日本語として受け止めれば良いのかな?という感じですね。

実際にPC上ではどんなことが起こっているのでしょうか。
確認していきましょう。

ローカルでは何が起きている?

現状を整理してみます。

同じPCの中で、

  • Goプログラムがサーバとして待ち受けている
  • curlがクライアントとしてリクエストを送信している
  • HTTP通信が行われている

まずは頭を整理するために、
サーバとクライアントの関係を
一番シンプルな形で図にしてみます。
図①

図①では、クライアントとサーバの関係を整理しました。

次に、「それがどこで動いているのか」を見てみます。
今回の例では、curl も Goサーバも
同じPCの中で動いています。

ただし、同じPC上でも
それぞれは **別のプログラム(別のプロセス)**として起動しています。
図にしてみましょう。

図②

OSは、localhost:8080 宛ての通信を受け取り、
該当するGoサーバのプロセスへHTTPリクエストを送ります。
その結果として、レスポンスが返ってくることになります。


Go言語のプログラムについて

先ほどのコードを、もう一度見てみます。

curlからリクエストが届くと、
http.HandleFunc で登録した handler が呼ばれます。

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintln(w, "返したよ!")
}

w に書き込んだ内容が、
HTTPレスポンスとして返されます。


まとめ

今回は、
・同じPC内で
・curlとGoサーバという2つのプロセスが
・HTTP通信をしている

という、一番シンプルな構成を確認しました。

その結果、curlは
「HTTPリクエストを送るためのクライアント」
としての役割を持っていることが分かりました。

まだまだ、学んでいくことは多いなあと思います。
インプットもアウトプットも、少しずつ頑張っていきたいですね。

では、また!

Discussion