curlコマンドを掘り下げる

# はじめに
こんにちは！

APIの検証でお世話になっている`curl`コマンド。
みなさんはどのくらい使いこなしているでしょうか。

私もよく使うのですが、おそらく、ほんの一部の機能しか使ってません。

そこで、今回は、`man curl`の内容からピックアップしてご紹介しようと思います。

# `man curl`の情報量

Linuxユーザーなら一度は使ったことのある`man`コマンドでcurlの説明がどのくらいあるのか、確認してみます。

```bash
$ man curl | wc -l
    6365
```

６千行、、ちょっとした書物ですね。

多すぎるので、ざっくり見て、幾つかピックアップします。

## 基礎編: Webアクセス系

#### 1. curlの最も基本的な使い方
```bash
$ curl https://www.example.com
```


#### 2. ファイルをダウンロード（結果を保存）
`-o` オプションで指定したファイルにWebページの内容を保存。

```bash
$ curl -o index.html https://www.example.com
```

#### 3. HTTPヘッダーを取得
`-I` オプションでHTTPヘッダー情報のみを取得。

```bash
$ curl -I https://www.example.com
```

#### 4. リダイレクトを追跡
`-L` オプションでリダイレクト (301, 302など) を自動的に追跡。

```bash
$ curl -L https://www.example.com/redirect
```

## 応用編: リクエスト系

#### 5. POSTリクエストを送信
`-d` オプションでPOSTリクエストを送信。

```bash
$ curl -d "name=value&another=anothervalue" https://www.example.com/api
```

#### 6. 特定のHTTPメソッドを指定
`-X` オプションでGETやPOST以外のHTTPメソッド (PUT, DELETE, PATCHなど) を使用。

```bash
$ curl -X PUT -d "data=updated" https://www.example.com/api/resource
```

#### 7. カスタムヘッダーを送信
`-H` オプションでHTTPリクエストにカスタムヘッダーを追加。

```bash
$ curl -H "User-Agent: MyCustomAgent" https://www.example.com
```

#### 8. フォームデータを送信
`-F` オプションでmultipart/form-data形式のデータを送信。 (ファイルアップロードなど)

```bash
$ curl -F "file=@image.jpg" https://www.example.com/upload
```

#### 9. クッキーを扱う
`-b` オプションでクッキーを送信し、 `-c` オプションでクッキーを保存する。

```bash
$ curl -b cookie.txt -c cookie.txt https://www.example.com
   ```

#### 10. HTTP/2を使用
`--http2` オプションでHTTP/2プロトコルを使用する。
http通信などで使うと、高速化されていいらしい。

```bash
$ curl --http2 https://www.example.com
```

## 実践編: ネットワーク状況を把握 & デバッグ

#### 11. 接続時間を制限
`--connect-timeout` オプションで接続タイムアウトを設定。

```bash
$ curl --connect-timeout 5 https://www.example.com
```

#### 12. 転送速度を制限
`--limit-rate` オプションで転送速度を制限。
1Bなどにすると、途中で止まります。

```bash
$ curl --limit-rate 100K https://www.example.com
```

#### 13. 転送状況を詳細に表示
`-v` オプションで詳細な転送状況を表示。 (ヘッダー情報、接続情報など)
たまに見ると面白いです。

```bash
$ curl -v https://www.example.com
```

#### 14. トレースログを出力
`--trace` オプションで送受信データを含む詳細なトレースログをファイルに出力。

```bash
$ curl --trace trace.log https://www.example.com
```

#### 15. ネットワークインターフェースを指定
`--interface` オプションで使用するネットワークインターフェースを指定。
一度だけ使った気がする。（詳細は覚えてないです）

```bash
$ curl --interface eth0 https://www.example.com
```

#### 16. DNSサーバーを指定
`--dns-servers` オプションで使用するDNSサーバーを指定。

```bash
$ curl --dns-servers 192.168.0.1,192.168.0.2 https://example.com
```

## 上級編: curlをさらに使いこなす

#### 17. コマンドライン変数を使う
`--variable` オプションで変数を定義し、 `--expand-` プレフィックス付きのオプションで参照。

```bash
$ curl --variable token=my_secret_token --expand-header "Authorization: Bearer {{token}}" https://api.example.com
```

#### 18. curlコマンドをC言語のコードに変換
`--libcurl` オプションで、curlコマンドをC言語のlibcurl関数を使ったコードに変換。
こちら、確かにC言語で出力されました。
```bash
$ curl --libcurl example.c https://www.example.com
```

#### 19. 外部コマンドと連携
`|` (パイプ) や `>` (リダイレクト) を使って、curlの出力を他のコマンドに渡したり、ファイルに保存したりできる。

```bash
# curlの出力をgrepでフィルタリング
$ curl https://www.example.com | grep "keyword"

# curlの出力をファイルに保存
$ curl https://www.example.com > output.txt
```

#### 20. 設定ファイルを使う
`-K` オプションで設定ファイルを読み込み、curlの動作をカスタマイズ。

```bash
$ curl -K config.txt https://www.example.com
```

# まとめ
curlは奥が深いですね、、、

今回は、curlコマンドの基本的な使い方から応用編までご紹介しました。

curlを使いこなすと、作業効率がかなりアップします。
マスターすると、検証が非常に楽になりそうです。

私もまだ道半ばですが、みなさんも一緒にがんばりましょう！