curlとは何か?Goで作ったローカルAPIを例に仕組みをイメージしてみる
はじめに
こんにちは!Zenn初投稿になります。
市役所で働きつつ、エンジニアとしての仕事に興味を持ち、現在はGo言語を学んでいます。
Go言語で簡単なAPIを実装したとき、
curlというコマンドを使って
「ちゃんとレスポンスが返ってくるか」を確認しました。
でも、そもそも curl って何なんだ?
正直なところ、全然イメージが湧かないなと思いました。
GPTに「叩いてみて」と言われたから叩いただけ、という状態です。
それではただの作業で意味がありませんよね。
というわけで今回は、
「curlで何が起きているのか」 を
一番シンプルなローカル環境で整理してみます。
このコミュニティでも、curlに関する記事はたくさんあると思います。
その中で、自分なりの理解を深めるために、
学習メモとして記事にしてみました。
今回の記事のゴールは、以下とします。
curlで叩くと、なぜGoサーバからレスポンスが返ってくるのかを
ローカル環境でイメージできるようになること
今回行ったこと
今回行ったことは、以下の3つです。
- Go言語でHTTPサーバを実装する
- ターミナルでサーバを起動する
- 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