よく使用するcURLコマンド

12/23って思い出深いですよね。

さて今週はみんな大好き、
curl（主にコマンド）について記事を書こうと思います。
読み方については「シーユーアールエル」と「カール」があるのですが
「カール」が正しいようです。

curl自体の説明は色んな方がされているので
使用頻度が高いであろうコマンドをメインに、備忘録も兼ねてまとめてみました。

# curlとは
様々な通信プロトコルをサポートし、リクエストを送信することが可能です。


有名どころでいうとこんな感じ
`FTP, HTTP, HTTPS, IMAP, LDAP, POP3, SCP, SFTP, SMB, SMTP, Telnet`
> 公式HP：https://curl.se

メールの送受信できるのは知らなったです！
ただ現状、使うことは無さそうなので、ここまでに。

# 使い方

基本的なコマンドはこちらになります。
`curl [option(long option)※複数可] [対象URL]`

例）
`curl -v https://example.com`
`curl --verbose GET https://example.com`

## 主なオプション一覧

|  option  |  long option | 機能  |
| ---- | ---- | ---- |
|  -o  |  --output  | 指定ファイルに標準出力内容を保存  |
|  -v  |  --verbose  | リクエスト、レスポンスのヘッダ情報表示  |
|  -A  |  --user-agent  | ユーザーエージェントを設定  |
|  -u  |  --user  | ベーシック認証情報を設定  |
|  -H  |  --header  | リクエストヘッダに情報を追加/更新  |
|  -X  |  --request  | リクエストメソッドを設定<br>※デフォルト（未指定の場合）はGETになる  |
|  -d  |  --data  | POSTリクエストのパラメータを設定 <br>※リクエストも自動的にPOSTになるので-Xの指定は不要  |
|  -F  |  --form  | データ形式がmultipart/form-dataに<br>ファイルアップロードで使用する   |
|  -b  |  --cookie | サーバーにクッキーを送信  |
|  -c  |  --cookiejar | サーバーから受信したクッキーを保存  |

> 公式マニュアル：https://curl.se/docs/manpage.html


#`-o（--output）<file_name>`：<br>標準出力された内容をファイルに保存#
実行：`$ curl -o hoge http://example.com`

```
$ curl -o hoge http://example.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1256  100  1256    0     0   2136      0 --:--:-- --:--:-- --:--:--  2132

$ cat hoge
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">


      ----- 省略 -----


</body>
</html>
```

#`-v（--verbose）`：<br>リクエスト、レスポンス、のヘッダ情報表示#
実行：`$ curl -v 'Mozilla/5.0' http://example.com`

```
$ curl -v http://example.com
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.58.0
> Accept: */*
< HTTP/1.1 200 OK
< Age: 554000
< Cache-Control: max-age=604800
< Content-Type: text/html; charset=UTF-8
< Date: Mon, 21 Dec 2020 14:21:45 GMT
< Etag: "3147526947+ident"
< Expires: Mon, 28 Dec 2020 14:21:45 GMT
< Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
< Server: ECS (sjc/4E8D)
< Vary: Accept-Encoding
< X-Cache: HIT
< Content-Length: 1256
```
リクエストヘッダは > で表示
レスポンスヘッダは < で表示

#`-A（--user-agent）<ua>`：<br>ユーザーエージェントを指定#
実行：`$ curl -v -A 'Mozilla/5.0' http://example.com`
 
```
$ curl -v -A 'Mozilla/5.0' http://example.com
> GET / HTTP/1.1
> Host: example.com
> User-Agent: Mozilla/5.0 
↑↑↑↑↑ 指定したUser-Agent（'Mozilla/5.0'）が設定されてますね！
```
#`-u（--user）<user>:<password>`：<br>ベーシック認証情報を設定#
実行：`$ curl -u admin:password1234 http://example.com`

ベーシック認証が掛かってるステージング環境など、API確認で有効です。


#`-H（--header）`：<br>リクエストヘッダに情報を追加/更新#
実行：`$ curl -v -H "Content-Type: application/json" http://example.com`


```
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Type: application/json 
↑↑↑↑↑ 指定したヘッダ情報（Content-Type: application/json）が設定されてますね！
```

json形式など、指定フォーマットで送信時に使用

#`-X（--request）`：<br>リクエストメソッドを設定#
実行：`$ curl -v -X POST http://example.com`

```
$ curl -v -X POST http://example.com
> POST/ HTTP/1.1 
↑↑↑↑↑ メソッドがPOSTに設定されてますね！
> Host: example.com
> User-Agent: curl/7.58.0
```


#`-d（--data）`：<br>リクエストのパラメータを設定#
実行：`$ curl -H "content-type: application/json" -X POST -d '{"hoge1":"test1"}' http://example.com`

json形式で以下データをPOST

```hoge.json
{
  "hoge1": "test1"
}
```
ファイルを指定することも可能
※ファイル名の前に`@`を設定
実行：`$ curl -H "content-type: application/json" -X POST -d @hoge.json http://example.com`

#`-f（--form）<file>`：<br>データ形式がmultipart/form-dataにしてファイル送信#
実行：`$ curl -v -X POST -f @hoge.png http://example.com`

先ほど説明した通りファイル指定（@ファイル名）が可能になるので
画像ファイルをPOST形式でリクエストができます。
※画像登録などのAPIの確認で使えますね！

> multipart/form-data及びboundaryの分かりやすく説明されているサイト
https://www.yoheim.net/blog.php?q=20171201


#`-b（--cookie）<cookie file>`：<br>サーバーにクッキーを送信#
実行：`$ curl -v -b cokkie http://example.com`

#`-c（--cookiejar）<cookie file>`：<br>サーバーから受信したクッキーを保存#
実行：`$ curl -v -c cokkie http://example.com`


#便利な使い方#
* サーバのIPアドレスを調べたい場合

`curl ifconfig.me`
IPアドレス（xxx.xxx.xxx.xx）が返却される

> 参考にさせていただいた記事
https://qiita.com/ShibuyaBizman/items/f26a956de04e93aef111

* サーバにクッキーを送信、受信したクッキーを再び保存

`$ curl -b cookie -c cookie http://www.example.com`


※随時追加予定（予定）


# GUIがお好みの方
curlはCUIですが、視覚的に見やすいGUIで便利なツール
「postman」を最後に紹介できればと思います。
公式HP：https://www.postman.com

**良い所**

 * パラメータの入力のしやすい
 * レスポンスデータが整形されて見やすい
 * 通信プロトコルのカバー率（ほぼ全て？）
 * 基本無料
 * アプリ / ウェブどちらでも使用可能
 * そして無料

全てにおいて優秀です。

curlもそうですが、フロント/バックエンド関係なく通信部分の確認は
使用頻度が高いと思いますので、ぜひ利用してみてください。

私も普段はpostmanを使っています。
こんなにcurlの事を書いておいて、題名もcurlなのに。
使いやすいので。

おわり

## 参考サイト一覧
https://curl.se
https://www.yoheim.net/blog.php?q=20171201
https://www.postman.com


アドベントカレンダーも残り2日！
フロントの二人が最後を締めくくってくれます！
KOご期待！:beers:

**Now hiring！**
プラコレでは、自由な未来をつくるために
一緒に冒険したいエンジニア・デザイナーを募集しています！
https://www.wantedly.com/projects/262436
運営サービス
[PLACOLE(プラコレウェディング)](https://pla-cole.wedding)
[DRESSY(ドレシー)byプラコレ](https://dressy.pla-cole.wedding)
[farny(ファーニー)byプラコレ](https://www.farny.jp)