curlコマンドでHTTPリクエスト macOS/Linux/Unixシェルコマンド

皆さん大好き curl コマンドの備忘録的な記事になります。

curl で HTTPS プロトコルを使ってリクエスト

特段何の設定もなく、curl で HTTPS リクエストできました。

zsh
curl https://apppppp.com/jojo.json

curlを実行したときに HTTP リクエストのヘッダーを表示させる

-v オプションを付与することで、 送信と受信のHTTP リクエストのヘッダーを出力できます。
zsh
$ curl -vI https://101010.fun/

さらに -I オプションで、コンテンツのボディは含まずにヘッダーのみを取得しています。 -I は、指定されたURLに対してHEADリクエストを送信し、レスポンスのヘッダーのみを表示します。

zsh
*   Trying [64:ff9b::9979:42f3]:443...
...
> HEAD / HTTP/2
> Host: 101010.fun
> User-Agent: curl/8.4.0
> Accept: */*
> 
< HTTP/2 200 
HTTP/2 200 
< server: nginx
server: nginx
< date: Sun, 03 Mar 2024 11:06:59 GMT
date: Sun, 03 Mar 2024 11:06:59 GMT
< content-type: text/html
content-type: text/html
< content-length: 17419
content-length: 17419
< last-modified: Sun, 03 Mar 2024 00:34:27 GMT
last-modified: Sun, 03 Mar 2024 00:34:27 GMT
< etag: "65e3c593-440b"
etag: "65e3c593-440b"
< accept-ranges: bytes
accept-ranges: bytes

curl で POST リクエスト、JSON データの送信

curl コマンドを使用して POST リクエストを行い、JSON 配列をボディとして送信する例です。
zsh
curl -X POST -H "Content-Type: application/json" -d '[{"key1":"value1"}, {"key2":"value2"}]' http://example.com/endpoint
-d オプション(または --data)を使用して JSON 配列をボディとして含めます。Content-Type ヘッダーには application/json を指定します。JSONデータは基本、ダブルクオーテーションで囲みましょう。シングルクオーテーションで囲むと、サーバー側が対応してなくてエラーになる場合があります。

リクエストが長い場合に、途中で切れてトラブルになる

OAuthのBearer認証などで長いトークンを送信する場合は、かならずクオーテーションで囲むようにしましょう。囲まないと長い送信データは途中で切れてしまい、正しいリクエストが行えません。

zsh
curl -H POST 'https://example.com/endpoint' -H 'Content-Type: application/json;charset=utf-8' -d '{"id":"1", "name":"jojo"}' -H 'Authorization: Bearer XXXX'

ローカルの画像やCSVファイルをcurlで送信したい

curl コマンドを使用してローカルのファイル(画像やCSVファイルなど)も送信できます。-F(または--form)オプションを使用します。このオプションは、multipart/form-data 形式でファイルをPOSTリクエストとして送信します。
zsh
curl -X POST -F "image=@image.png" http://example.com/upload

Webアプリ開発で、フォームのアップローダーを機能をテストするときに便利ですね。

UserAgent を指定したい

curl でリクエストすると、デフォルトでは UserAgent が curl/8.4.0 のようになります。これでは curl でリクエストしたことがバレバレです(笑)UserAgent を変更するには -A オプションを使用します。
zsh
curl -A "Chazuke/2.1" https://example.com

Cookie を指定したい

昨今、Cookieの同意を求めるダイアログが、多くのサイトで実装されている世の中です。同意したところで、Cookieに保存されるのでしょうから、Cookieの期限切れやブラウザのキャッシュを削除すればまた同意を求められるという。。煩わしいったらありゃしない。あれって意味あるのでしょうか?

そんなことはさておき、 curl コマンドでCookieを指定してリクエストを送信するには、-b(または--cookie)オプションを使用します。このオプションに続けて、Cookieの名前と値を名前=値の形式で指定します。複数のCookieを送信する場合は、セミコロン(;)で区切って指定することができます。

zsh
curl -b "username=chazuke; sessionid=123456" https://example.com

この例では、usernamesessionidという2つのCookieを設定しています。usernameの値はchazukesessionidの値は123456です。

事前に用意したCookieファイルから読み込むことも可能です。

bash
curl -b cookies.txt https://example.com

jqコマンドと組み合わせて、JSONを読みやすくする

curl と組み合わせてよく使われるのが、jq コマンドです。
アプリケーションインストールコマンド
jq$ brew install jq
curl でリクエスト後に、パイプで標準出力をjqへ渡してあげます。
zsh
$ curl https://apppppp.com/jojo.json | jq

こちらのように JSON データが成形されて見やすく表示されます。

結果
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    43  100    43    0     0    128      0 --:--:-- --:--:-- --:--:--   128
{
  "name": "Jyotaro",
  "stand": "The World"
}
jq コマンドは、ローカルファイルも入力できますから、便利なコマンドですね。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム