curlコマンドは、出来ることがたくさんなのですね！

# はじめに
たまに見かける「curl」コマンド。
名前からも、何をするものか想像も出来ず、特に使うこともなく今現在まで至っていました。
しかし、とうとうcurlの壁にぶち当たりました！笑
そこで、どういったことが出来るかを調べたので、備忘録も兼ねて自分と同じ状況の人の手助けになれたらと思います！

# curlコマンドとは？
curlコマンドとはサーバから、もしくはサーバへデータ転送を行うコマンドのことです。
httpリクエストができるコマンドなイメージではありますが、APIを叩いたりすることができるというだけで、HTTPのGETやPOSTはもちろん、HTTPSやFTP, Telnet, SMTP, IMAP, POP3など様々な通信プロトコルをサポートしています。

※ちなみにcURLとは、【client for URL】という意味らしいです！

# jqコマンドについて
jqコマンドは入力を受け取り、出力を生成するフィルタの役割を果たします。
特定のデータを抽出したり整形したりできるのですが、今回は整形して見やすくするためだけに使用します。
※JSON形式のみ対応可能です。

インストールはhomebrewで出来ます。

```ruby
$ brew install jq
```

# 基本的な使い方
curlコマンドの基本形は下記の通りです。

```ruby
curl [options] [URL]
```

## GETリクエスト
GETリクエストの場合は、特に何も指定せずURLを打ち込むだけで大丈夫です。

```ruby
$ curl localhost:3000/api/json | jq .
```

## GET以外のリクエストの場合
明示的にリクエストメソッドを指定したい場合は`-X リクエストメソッド "URL" `で変更することができます。

```ruby
$ curl -X POST "localhost:3000/api/json" | jq .
```

## ファイルに出力したい場合
`-o` オプションを指定することでファイルに出力できます。

```ruby
# $ curl URL -o 出力したいファイル名
$ curl localhost:3000/api/json -o response
```

## コンソールの出力をカスタマイズしたい場合
`-#` オプションを使うと、プログレスバーのような表記に変更できます。

```ruby
$ curl localhost:3000/api/json -o response -#
######################################################################## 100.0%
```

`-s`オプションで、プログレス情報を非表示にできる。

```ruby
# Portを間違えているが、-sはエラーメッセージもでない
$ curl -s localhost:3001/api/json | jq .

# -Sをつけることで、エラーメッセージが出力される。
$ curl -Ss localhost:3001/api/json | jq .
#=> curl: (7) Failed to connect to localhost port 3001: 接続を拒否されました
```

## ヘッダーを確認したい場合
`-I`オプションで、Headerのみ取得し、出力することができます。

```ruby
$ curl -I -s 'localhost:3000/api/json?' | jq .
HTTP/1.1 200 OK
.
.
.
```

`-i` ならば、Response Header,Bodyの両方を出力できます。

```ruby
$ curl -i -s 'localhost:3000/api/json?' | jq .
HTTP/1.1 200 OK
.
.
.

{
...
}
```

## ヘッダーを変更したい場合
`-H “パラメータ: “値” ` をつけることで、HTTPヘッダを追加することができます。

```ruby
$ curl -X POST "localhost:3000/api/json" -H "accept: application/json" | jq .
```

## パラメーターを送信したい場合
`‘{“パラメータ”}: {“値”}’`でパラメーターを送信できます。

```ruby
$ curl -X POST -d '{"hoge1":"fuga1", "hoge2":"fuga2"}' "localhost:3000/api/json"
```

## パラメータ付きPOSTとURLエンコード
`--data-urlencode` を使うと、curlがURLエンコードしてくれるので、そのまま書いてしまうことができます。

```ruby
# URLエンコードはcurlに任せてPOST
$ curl -w '\n' 'http://localhost:8080/job/sample/configSubmit' --data-urlencode 'json={"properties": {"hudson-model-ParametersDefinitionProperty": {"parameterized": {"parameter": {"name": "FileParameter", "description": "Upload file to Jenkins.", "stapler-class": "hudson.model.FileParameterDefinition", "$class": "hudson.model.FileParameterDefinition"}}}}}' -d 'Submit=Save' -XPOST
```

## ファイルをUploadするPOST
`--form` もしくは `-F`を使用することで、ファイルをUploadできる。

```ruby
# Upload用ファイルを用意
$ echo "Sample file" > sample.txt

# Fileパラメータにsample.txtを指定してビルド実行
$ curl -sS 'http://localhost:8080/job/sample/build' -X POST -F "file=@sample.txt" -F 'json={"parameter": [{"name":"FileParameter", "file":"file"}]}'
```

## HTTP通信の詳細を出力を確認したい場合
`-v`オプションを付与することで、HTTP通信の詳細を出力することが出来ます。

```ruby
$ curl -v -X POST -d'{"hoge1":"fuga1", "hoge2":"fuga2"}' "localhost:3000/api/json"
```

## エラーコードを確認したい場合
`-f`オプションを付与することで、異常終了時に、終了コードで終わってくれます。

```ruby
$ curl -f -X POST "localhost:3000/api/jsonstatus/404"                                                     
#=> curl: (22) The requested URL returned error: 404 NOT FOUND
```

# おわりに
curlコマンドはシンプルかと思いきや、出来ることがありすぎて複雑でした。。
しかし、基本的な使い方はシンプルなので、使っていくうちに慣れていくかもしれないですね！

# 参考
[curlコマンドでちょこっとHTTPリクエストを試すだけの記事]
(https://qiita.com/akane_kato/items/34b408336f4ec372b139)

[curl コマンド 使い方メモ]
(https://qiita.com/yasuhiroki/items/a569d3371a66e365316f)

[curl コマンド]
(https://hydrocul.github.io/wiki/commands/curl.html)