【最新サービス試用⑧】リクエスト管理やJSON出力結果整形等に便利なcurl拡張コマンドツールの「curlx」を試用。

- 日々輩出される素晴らしき最新サービスを素早く試して、不鮮明な先見性を堂々と誇示する記事第八弾。
- [歴史的偉人の集中力](https://qr.ae/TWnNFL)の記事の、収集作業に精を出している生活。
- 今回は、curlでの出力の際に、Terminal上であらゆる高機能な作業が可能な「**curlx**」を試用することにしよう。

## 概要
- レスポンス確認やAPI通信の際の際に用いる「curl」のリクエストの管理が捗るコマンドツール。
- 「JSONでの出力結果の整形」や「リクエストのコレクション(グループ化)」等の機能を、GUIツール等を利用せずに、ターミナル内のみで可能。
- GUIツールの「Postman」やJSON整形コマンドツールの「jq」の両方の機能を備えたようなツール。
- [公式サイト](https://www.getpostman.com/)
- [公式Github](https://github.com/shivkanthb/curlx)

## 特徴
### 出力結果の整形
- 可読が容易ではないcurlでのJSON出力結果を、cxでは整形して、見やすく表示してくれる。
- jqを利用することなく、標準で整形してくれる。

### リクエスト履歴の視覚化
- リクエスト履歴の確認が容易に可能であることに加え、ステータスや通信形式、時間等の詳細情報が表として、わかりやすく確認できる。

### リクエストのコレクション(グループ)化
- リクエストをカテゴリごとにグループ化できるため、「よく投げるコマンドのエイリアス登録」や「内容別でのリクエストのグループ管理」が可能。
- Postmanでのコレクション機能を、ターミナル内で利用が可能。

## 結果
- ※**テストAPIとして、Livedoorさんの[Weather Hack](http://weather.livedoor.com/weather_hacks/)を利用。**

- 下記のように、curlでは見づらいjson形式や文字化けが、簡単なコマンドで見やすくなる。

<img width="1440" alt="test.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/a9d8ebb1-fce0-80af-0e17-743c15dd813f.png">

- 通信形式やステータス結果等も含んだ、わかりやすい履歴の表示も可能。

<img width="560" alt="status.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/9e957180-cb58-bb0a-bcf7-de701e163021.png">

- よく使う出力等を、グループ化で整理して、簡単なコマンドでリクエストが可能。

<img width="683" alt="collection_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/0010ccbc-1ae4-b094-a1d4-92380c5748e8.png">

## 作業環境
- Amazon Linux 2
- Node.js v10.16.0
- npm 6.9.0
- ※**Node.js環境が利用できれば、MacやWindowsでも可能。**

## インストール
- curlxのインストールは、Nodejsのnpmやyarnで可能なため、未導入の場合は、下記を参考にインストールする。
    - [MacでのNode.jsインストール](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)
    - [WindowsでのNode.jsインストール](https://qiita.com/maecho/items/ae71da38c88418b806ff)
    - [LinuxでのNode.jsインストール](https://www.sejuku.net/blog/72545#LinuxOS)
    - [Amazon LinuxでNode.jsインストール](https://blog.katsubemakito.net/nodejs/install_amazonlinux)

- Node.jsのインストール後、下記のコマンドをうち、バージョン確認をする。

```bash
# Node.jsのバージョン確認
$ node -v

# npmのバージョン確認
$ npm -v
```

- 確認後、下記のコマンドをうち、「**curlx**」のインストールを行う。

```bash
# curlxのインストール
$ sudo npm install curlx -g

# バージョン確認
$ cx version
```

## 基本操作
- curlxの基本操作は、下記。
    - ※**基本的にcurlコマンドをcxに置き換えるだけで可能。**

|内容|コマンド|
|:---:|:---:|
|通常リクエスト|`cx 接続先URL`<br>※オプション指定なしで、ヘッダー出力やjson整形が可能。|
|リクエスト(オプション付き)|`cx -オプション URL`<br>※**オプションは、curlと同様なため、curlをcxに置き換えるだけ。**<br>例 : `cx -X GET URL`|
|リクエスト履歴確認|`cx history`|
|リクエストのグループ(コレクション)化|`cx new collections`<br>実行後、いくつかの質問に回答していく形で、作成していく<br>詳細は、下記の[操作例](#操作例)を確認。|
|作成コレクションへのリクエストの追加|`cx new request`<br>コレクション作成同様、質問形式で追加していく<br>詳細は、下記の[操作例](#操作例)を確認。|
|コレクション一覧|`cx collections`|
|idやコレクションリクエストでの実行|`cx run <id or collection_id>`<br>詳細は、下記の[操作例](#操作例)を確認。|
|リクエストやコレクションの削除|`cx delete <id or collectionname>`<br>詳細は、下記の[操作例](#操作例)を確認。|
|ヘルプページ確認|`cx help`|
|バージョン確認|`cx version`|

## 操作例

### 通常リクエスト
- 下記のコマンドをうち、URLでの通常リクエストを行う。
    - ※**オプションは、curlと同様に扱えるため、cxに置き換えるだけでよい。**

```bash
# 通常リクエスト
$ cx http://weather.livedoor.com/forecast/webservice/json/v1?city=471010

# オプション指定でのリクエスト
$ cx -X GET http://weather.livedoor.com/forecast/webservice/json/v1?city=471010
```

### コレクションの作成〜実行
- 下記のコマンドをうち、cxコマンドをグループ化することで、任意の名前とidでリクエストが可能。

```bash
# コレクション(グループ)を作成
$ cx new collection

✔ Name of your new collection … コレクション名(例:getWeather)入力

This collection already exists
✔ Would you like to add a new request to getWeather … リクエスト追加確認(例:yes)

✔ Enter complete request  eg: cx -X GET https://httpbin.org/get … 実行コマンド入力(例:cx -X GET URL)

✔ Give a name for your request … リクエスト名(例:getOkinawa)

# コレクション一覧確認
$ cx collections

┌────────────┬────────────────────┬────────┬──────────────────────────────┐
│ id         │ name               │ method │ url                          │
├────────────┼────────────────────┼────────┼──────────────────────────────┤
│ y2Q9JCOjL  │ getOkinawa         │ get    │ http://weather.livedoor.com… │
└────────────┴────────────────────┴────────┴──────────────────────────────┘


# id名でのリクエスト実行
# まず、history(履歴)内のid名での実行
$ cx history

┌────────────┬────────┬──────────────────────────────┬────────┬────────────┐
│ id         │ method │ url                          │ status │ timestamp  │
├────────────┼────────┼──────────────────────────────┼────────┼────────────┤
│ H0yIigcQv  │ get    │ http://weather.livedoor.com… │ 200    │ 2019-7-13  │
│            │        │                              │        │ 12:51 PM   │
├────────────┼────────┼──────────────────────────────┼────────┼────────────┤

$ cx run H0yIigcQv

{
  "pinpointLocations": [
    {
      "link": "http://weather.livedoor.com/area/forecast/4720100",
      "name": "那覇市"
    },
    {


# コレクション内のリクエストidでの実行
# ※コレクション内のidは、コレクション名も同時に明記する必要がある。
$ cx run getWeather y2Q9JCOjL

{
  "pinpointLocations": [
    {
      "link": "http://weather.livedoor.com/area/forecast/4720100",
      "name": "那覇市"
    },
```

### コレクションへのリクエスト追加
- 下記のコマンドをうち、既存コレクションに新規リクエストを追加

```bash
# コレクション確認
$ cx collections

┌────────────┬────────────────────┬────────┬──────────────────────────────┐
│ id         │ name               │ method │ url                          │
├────────────┼────────────────────┼────────┼──────────────────────────────┤
│ y2Q9JCOjL  │ getOkinawa         │ get    │ http://weather.livedoor.com… │
└────────────┴────────────────────┴────────┴──────────────────────────────┘

# リクエストの新規追加
$ cx new request

✔ Name of your new collection … コレクション名(getWeather)入力

✔ Enter complete request  eg: cx -X GET https://httpbin.org/get … 実行コマンド(例:cx URL)

✔ Give a name for your request … リクエスト名(getOsaka)

# コレクション一覧再確認
$ cx collections

┌────────────┬────────────────────┬────────┬──────────────────────────────┐
│ id         │ name               │ method │ url                          │
├────────────┼────────────────────┼────────┼──────────────────────────────┤
│ y2Q9JCOjL  │ getOkinawa         │ get    │ http://weather.livedoor.com… │
├────────────┼────────────────────┼────────┼──────────────────────────────┤
│ nG3nzD53k  │ getOsaka           │ get    │ http://weather.livedoor.com… │
└────────────┴────────────────────┴────────┴──────────────────────────────┘
```

### リクエストidやコレクションidの削除
- 下記のコマンドをうち、リクエストidやコレクションの削除を行う。

```bash
# id名でのリクエスト削除
$ cx delete H0yIigcQv

# コレクション内のid名でのリクエスト削除
$ cx delete getWeather:y2Q9JCOjL
```

## 操作履歴やコレクション確認
- curlxの操作履歴やコレクション一覧は、下記のファイルで確認できる。
    - ※**curlxの履歴やコレクションといった情報は、ルートフォルダの「cxdb」というフォルダに保存されている。**
    - ※**簡単な履歴やコレクション確認の際は、上記の操作例での操作方法で可能。**

```bash
# 操作履歴格納ファイルの中身確認
$ less ~/cxdb/history.json

{
  "history": [
    {
      "id": "UsVI7Oq9Y",
      "method": "get",
      "command": "curl -i \"http://weather.livedoor.com/forecast/webservice/json/v1?city=471010\"",
      "url": "http://weather.livedoor.com/forecast/webservice/json/v1?city=471010",
      "status": "200",
      "ts": "2019-7-12 11:58 PM"
    },
    {
      "id": "So_ybzFn3",
      "method": "get",
      "command": "curl -i \"http://weather.livedoor.com/forecast/webservice/json/v1?city=471010\"",
      "url": "http://weather.livedoor.com/forecast/webservice/json/v1?city=471010",
      "status": "200",
      "ts": "2019-7-13 12:01 AM"
    },
```

```bash
# コレクション一覧ファイルの中身確認
$ less ~/cxdb/collection.json

{
  "collections": {
    "getWeather": [
      {
        "id": "y2Q9JCOjL",
        "name": "getWeather",
        "method": "get",
        "command": "curl -i \"-X\" \"GET\" \"http://weather.livedoor.com/forecast/webservice/json/v1?city=471010\"",
        "url": "http://weather.livedoor.com/forecast/webservice/json/v1?city=471010"
      }
```

## まとめ
- 今回は、curlでのAPI結果整形ということで、「Terminalのみでの利用幅の拡大」による「パソコンの容量削減」を感慨深く染みながら、記事を書く。
- 「利用機能による、GUIツールとCUIツールの併用」の誓いは、すぐさま「日毎の気分利用」に変化することを確信。
- しばらく、この賢人ツールとの付き合いが続くと感じたため、より一層開発者礼拝を強化。

## 参考
- https://curlx.dev/  
→公式サイトです。大変お世話になりました。
- https://github.com/shivkanthb/curlx  
→公式Githubです。大変お世話になりました。
- https://entry.anypicks.jp/product-curlx/  
→こちらの記事で知りました。大変お世話になりました。