🍣

curlでAPI叩くとき、-X POST って本当に必要?警告の意味と対処法を解説

に公開

https://android.benigumo.com/20250413/curl-inferred/

cURLを使ったAPIリクエストで表示されるメッセージ

Note: Unnecessary use of -X or --request, POST is already inferred.

これは一体何を意味しているのでしょうか?今回はこの警告の意味と、それに対するベストプラクティスについて解説します。

🔍 1. 警告メッセージの意味とは?

cURLでAPIにPOSTリクエストを送信する際に、次のような書き方をしていませんか?

curl -X POST "https://httpbin.org/post" -H "accept: application/json"

このとき、以下のような警告が表示されることがあります:

Note: Unnecessary use of -X or --request, POST is already inferred.

これはcURLが「POSTメソッドはすでに推論されているよ」と教えてくれているだけで、エラーではありません。つまり、-X POST を書かなくても cURL は POST リクエストだと自動で判断してくれています。

🧪 2. 実験:実際にリクエストを送ってみる

試しに、次のコマンドを実行してみましょう。

echo '{
  "user_id": 123,
  "name": "ワロ田",
  "age": 14
}' | curl -vs \
  -H 'Content-Type: application/json; charset=UTF-8' \
  -H 'Accept: application/json' \
  -d @- https://httpbin.org/post

このコマンドでは -X POST を使わず、標準入力からJSONを送信しています。するとcURLは、-d オプションがあることから自動的にPOSTリクエストだと判断します。

ログの中には次のようなリクエストヘッダが含まれています:

> POST /post HTTP/2
> Host: httpbin.org
> Content-Type: application/json; charset=UTF-8
> Accept: application/json

つまり、わざわざ -X POST を明示しなくても、cURLが自動で正しく振る舞ってくれるというわけです。

✅ 結論:

  • -d--data を使った時点でPOSTと見なされる

  • -X POST は冗長である

不要なオプションは削除することでコマンドがシンプルに

🔒 3. TLS接続と通信の詳細

cURLで-v-vsを指定すると、通信の詳細が表示されます。例えば、以下のような出力が得られます:

*   Trying 3.231.253.142:443...
* Connected to httpbin.org (3.231.253.142) port 443
* ALPN: server accepted h2
* Using HTTP2, server supports multiplexing
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
...
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* Server certificate:
*  subject: CN=httpbin.org
*  start date: Mar 27 00:00:00 2024 GMT
*  expire date: Jun 25 23:59:59 2024 GMT

この情報から分かること:

  • 通信に使われたTLSバージョン(ここではTLS 1.3)

  • 接続先のIPアドレスやポート

  • 証明書の内容(開始日・終了日・Common Name)

これらの情報を確認することで、通信の安全性やトラブル時の診断に役立ちます。

🧼 4. cURLコマンドのベストプラクティス

✂️ 不要なオプションを省く

以下のような書き方は冗長です:

curl -X POST -d '{"foo":"bar"}' https://example.com

ベストな書き方は次のようになります:

curl -d '{"foo":"bar"}' https://example.com

同様に、PUTDELETE-d を使えば推論されるケースがありますが、それらは用途に応じて -X を残すこともあります(明示的にしたい場合など)。

🎯 APIとのやりとりでのポイント

  • -dを使えばPOSTになる

  • -HでContent-TypeやAcceptを適切に指定する

  • @-を使えば標準入力からデータを送れる

-vでTLSや接続情報を確認できる

🧾 まとめ:cURLは賢い。だからシンプルに書こう

今回紹介したように、cURLは送信内容からHTTPメソッドを推論できる賢いツールです。特に-dを使う場合、-X POSTのような明示的指定は不要であり、かえって警告メッセージが出てしまいます。

ベストプラクティスは以下のとおり:

  • -Xの使い過ぎを避ける

  • -dを使えばPOSTになることを理解する

  • -vで通信内容を確認する習慣をつける

冗長な指定を避け、簡潔で読みやすいcURLコマンドを書くことで、日々の開発やAPI連携がよりスムーズになります。ぜひ今日から試してみてください。

☝️ 参考

https://android.benigumo.com/20250413/curl-inferred/

Discussion