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
-d オプション(または --data)を使用して JSON 配列をボディとして含めます。Content-Type ヘッダーには application/json を指定します。JSONデータは基本、ダブルクオーテーションで囲みましょう。シングルクオーテーションで囲むと、サーバー側が対応してなくてエラーになる場合があります。curl -X POST -H "Content-Type: application/json" -d '[{"key1":"value1"}, {"key2":"value2"}]' http://example.com/endpoint
リクエストが長い場合に、途中で切れてトラブルになる
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
この例では、usernameとsessionidという2つのCookieを設定しています。usernameの値はchazuke、sessionidの値は123456です。
事前に用意したCookieファイルから読み込むことも可能です。
bash
curl -b cookies.txt https://example.com
jqコマンドと組み合わせて、JSONを読みやすくする
curl と組み合わせてよく使われるのが、jq コマンドです。アプリケーション | インストールコマンド |
---|---|
jq | $ brew install jq |
zsh
$ curl https://apppppp.com/jojo.json | jq
こちらのように JSON データが成形されて見やすく表示されます。
結果
jq コマンドは、ローカルファイルも入力できますから、便利なコマンドですね。 % 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"
}
関連記事
アイデアノート > macOSで使えるシェル