curlコマンド入門

## はじめに
curlコマンドは、業務での使用頻度が高いですが、なかなか知識が定着しないので、アウトプットとして記事に残します。curlコマンドを触ったことない人にも参考になればなと思います。

## curlコマンドとは？
curlは、クライアントからサーバへリクエストし、データを転送するためのツールです。
様々なプロトコルをサポートしていますが、本記事では使用頻度の高いHTTPを取り上げます。

## curlコマンドで何が見れるの？
実際にコマンドを叩いて、リクエストしたものがどのように返ってくるのかを確認します。

curlコマンド実行は
```
curl [options...] <url>
```

googleトップページのURLを指定して、curlコマンドを実行してみます。
メソッドを明示的に指定しない場合は、GETリクエストが投げられます。
``` 
$ curl https://www.google.com
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="&#19990;&#30028;&#20013;&#12398;&#12354;&#12425;&#12422;&#12427;&#24773;&#22577;&#12434;&#26908;&#32034;&#12377;&#12427;&#12383;&#12417;&#12398;&#12484;&#12540;&#12523;&#12434;&#25552;&#20379;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;&#12373;&#12414;&#12374;&#12414;&#12394;&#26908;&#32034;&#27231;&#33021;&#12434;&#27963;&#29992;&#12375;&#12390;&#12289;&#12362;&#25506;&#12375;&#12398;&#24773;&#22577;&#12434;&#35211;&#12388;&#12369;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;" name="description"><meta content="noodp" name="robots"><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/logos/doodles/2023/yukie-chiris-120th-birthday-6753651837110050-l.png" itemprop="image">
*** 省略 ****
``` 
たくさん出てきたので省略していますが、Googleトップページのhtmlファイルが返ってきていますね。
レスポンス結果がすべて出てきても、必要のないケースが多いと思います。それに対応する``` [options...]```があったりするので、後述の「用途別コマンド例」で詳しく説明します。


## 用途別コマンド例
curlコマンドはオプションで用途別にレスポンスを確認することができます

### GET以外のメソッドでリクエストしたい
```
curl -X POST -w '%{http_code}\n'  "https://www.google.com" 
```
※ 丁度いいPOSTがうまくいくURLがなかったため、googleトップページにリクエストを投げています。結果はもちろん失敗しています。
- ```-X [http method]```
httpメソッドを指定できます。先ほども記載した通りで何も記載しないと、GETリクエストが投げられます。

### 結果をファイルに出力
```
$ curl -o ./hoge.txt  "https://www.google.com"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 18324    0 18324    0     0  90266      0 --:--:-- --:--:-- --:--:-- 90266

$ cat hoge.txt
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="&#19990;&#30028;&#20013;&#12398;&#12354;&#12425;&#12422;&#12427;&#24773;&#22577;&#12434;&#26908;&#32034;&#12377;&#12427;&#12383;&#12417;&#12398;&#12484;&#12540;&#12523;&#12434;&#25552;&#20379;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;&#12373;&#12414;&#12374;&#12414;&#12394;&#26908;&#32034;&#27231;&#33021;&#12434;&#27963;&#29992;&#12375;&#12390;&#12289;&#12362;&#25506;&#12375;&#12398;&#24773;&#22577;&#12434;&#35211;&#12388;&#12369;&#12390;&#12367;&#12384;&#12373;&#12356;&#12290;" name="description">....
```
- ```o```オプション
curlコマンド結果の出力先を指定できます。↑ではhoge.txtに結果が出力しているのがわかります。

### 進捗表示が邪魔なので消したい場合
以下のように進捗が表示されるの煩わしい場合は、```-s```で削除します。
```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 18388    0 18388    0     0  51943      0 --:--:-- --:--:-- --:--:-- 51943
```
```
$ curl -o ./hoge.txt -s  "https://www.google.com"
$
```


### ステータスコードのみ確認したい場合
```
$ curl -o /dev/null -w '%{http_code}\n' -s "https://www.google.com"
200 
```
- ```/dev/null```
```/dev/null```は書き込まれたデータを全て捨て（writeシステムコールは成功する）、読み出してもどんなプロセスに対してもデータを返さない。（参照： https://ja.wikipedia.org/wiki//dev/null）
つまり、curlコマンドでたたかれた結果は/dev/nullに書き込まれますが、データはすべて捨てられています。

- ```-w '%{http_code}\n'```オプション
改行してステータスコードを表示します。ステータスコードの詳細については以下記事を参考にしてみてください！
https://developer.mozilla.org/ja/docs/Web/HTTP/Status


## 参考
https://xtech.nikkei.com/it/atcl/column/14/230520/080400003/

https://qiita.com/shtnkgm/items/45b4cd274fa813d29539