curlコマンドを理解する

Bash, curl

この記事は最終更新日から1年以上が経過しています。

はじめに

お疲れさまです。システム開発グループの早瀬です。

先日とあるツールのドキュメントを読んでいると、以下のエンドポイントを叩くと必要な情報が手に入るよという文章が書かれていました。

http://${host}:${port}/auth/realms/{realm}/protocol/openid-connect/tokenにデータをPOSTしてるのだろうというのはなんとなく想像できるのですが、
これをPostmanから叩くにはどうすれば良いのか?という所で躓いたので、個人的な備忘録として残しました。

事前準備

curlコマンドが使えるのかを確認する。

curlコマンドを紐解く

さっそく遭遇したcurlコマンドを紐解いていきます。

  • 1,2行目から

curlではメソッド名を指定しない場合は自動でGETメソッドになってしまうため、その他のメソッドを使用する場合は -Xオプションを使用します。
上記の内容は、指定のURLに対してPOSTメソッドを実行しているという意味です。
(行末のバックスラッシュは改行を意味します。)

  • 3行目

次に -HオプションはHTTPのRequest Headerに情報を追加する方法です。
上記の内容は、リクエストヘッダに Authorizationをキーに Bearer ${access_token}を入れるという意味です。

  • 4行目

最後に --dataオプションはPOSTする値を示しています。
上記の内容は、 grant_typeをキーに、 urn:ietf:params:oauth:grant-type:uma-ticketを入れるという意味になります。

Postmanで実行

コマンドの意味を紐解くことが出来たので、Postmanで実行します。
(波括弧で囲われた部分には適宜、必要な値を代入してください。)

  • header
    image-20210330015439951.png

  • Body
    image-20210330015454550.png

しかし、エラーが発生して必要なデータの取得は出来ませんでした。

form-data と x-www-form-urlencodedの違い

結論から述べると、コンテンツタイプを form-dataにしていたことがエラーの原因でした。
form-dataは画像などの大きなバイナリデータを送信する場合に使用するもので、 --dataで指定されたものは x-www-form-urlencodedで送信しなければいけないそうです。
以下のように変更すると正しくデータを取得できました。

  • Body
    image-20210330015509920.png

反省点

コマンドを理解するために以下のサイトを参考にしたのですが、コンテンツタイプについては記載されていませんでした。
しかし、公式サイトのドキュメントにはしっかりと記載されていました。

(HTTP MQTT) Sends the specified data in a POST request to the HTTP server, in the same way that a browser does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass the data to the server using the content-type application/x-www-form-urlencoded.

ちゃんと公式ドキュメントを確認しようというお話でした。

まとめ

  • GET以外の方法でcurlを使用したい時は、 -Xオプションを使用する。
  • リクエストヘッダーに情報を付与するときは -Hオプションを使用する。
  • コンテンツタイプがapplication/x-www-form-urlencodedの時、ボディに情報を付与するには --dataオプションを使用する。
  • 公式ドキュメントをちゃんと読もう!

Bash, curl