HTTPリクエストをテキストで実行・テストできるHurl 6.1.0の紹介

「Hurl」というHTTPリクエストを簡単にテストできるとても便利なツールはご存知ですか？バージョン6.1.0が2025年3月にリリースされました。このツールの機能や使い方について紹介します。

## Hurlとは？

Hurlは、プレーンテキストでHTTPリクエストを実行・テストできるオープンソースのコマンドラインツールです。APIのテスト（JSON/GraphQL/SOAPなど）やデータ取得、CI/CDパイプラインでの自動テストなど、様々な場面で活用できます。

内部ではRustバインディングを利用したcurlをHTTPエンジンとして使用しており、高速で信頼性が高く、HTTP/3にも対応しています。

## 基本的な使用方法

### Hurlファイルの基本構造

Hurlファイルは、HTTPリクエストとそのレスポンスに対する検証を記述するためのシンプルなテキスト形式です。基本的な例は次のとおりです：

```hurl
GET https://example.org/api/tests/4567
HTTP 200
[Asserts]
header "x-foo" contains "bar"
certificate "Expire-Date" daysAfterNow > 15
ip == "2001:0db8:85a3:0000:0000:8a2e:0370:733"
jsonpath "$.status" == "RUNNING"    # ステータスコードの確認
jsonpath "$.tests" count == 25      # アイテム数の確認
jsonpath "$.id" matches /\d{4}/     # IDのフォーマットの確認
```

このように、リクエストとその後のアサーション（検証）をテキストファイルとして記述して実行するだけで、APIの動作確認やテストが行えます。

Hurlファイルは次のようにシンプルなコマンドで実行できます：

```bash
$ hurl file.hurl
```

複数のファイルを指定することもできます：

```bash
$ hurl file1.hurl file2.hurl
```

ディレクトリを指定すると、そのディレクトリ内の `.hurl` ファイルを再帰的に検索して実行します：

```bash
$ hurl tests/
```


テストモードで実行すると、各リクエストの結果がテスト結果として表示されます：

```bash
$ hurl --test integration/*.hurl
```

## Hurl 6.1.0の新機能

Hurl 6.1.0では、以下の新機能が追加されました：

1. レポートやログからの機密情報の編集（secrets機能）
2. 新しいクエリ：IPアドレス、HTTPバージョン
3. 新しいフィルター：base64のエンコード/デコード、toString
4. より多くのcurlオプション

それぞれについて詳しく見ていきましょう。

### 1. 機密情報の編集（secrets機能）

HTTP通信では、認証トークンやAPIキーなどの機密情報を扱うことが多いです。これらの情報がログやレポートに漏れると危険です。

例えば、以下のようなHurlファイルがあるとします：

```hurl
GET https://foo.com
Content-Type: application/json
x-password: {{password}}
HTTP 200
```

従来は、変数を使って次のように実行していました：

```bash
$ hurl --variable password=$PASSWORD foo.hurl
```

しかし、`--verbose`オプションを使うと、機密情報が表示されていました：

```bash
$ hurl --verbose foo.hurl
* ------------------------------------------------------------------------------
* Executing entry 1
*
* Cookie store:
*
* Request:
* GET http://foo.com
* x-secret: sesame-ouvre-toi
...
```

Hurl 6.1.0からは、`--secret`オプションを使うことで、機密情報をログやレポートから編集できるようになりました：

```bash
$ hurl --secret password=$PASSWORD foo.hurl
```

この方法では、変数として定義した機密情報が自動的にログやレポートから編集されます。さらに、動的なシークレット値を対応するために、`redact`キーワードとキャプチャー機能を組み合わせることもできます：

```hurl
GET http://bar.com/api/get-token
HTTP 200
[Captures]
token: header "X-Token" redact
```

- [Captures] - これはHurlの命令セクションで、HTTPレスポンスから値を抽出して変数に保存することを指示します
- token: - 抽出した値を保存する変数名を「token」と定義しています
- header "X-Token" - レスポンスヘッダーの中から "X-Token" という名前のヘッダーの値を取得します
- redact - 重要なポイントで、Hurl 6.1.0で追加された新機能です。この値を機密情報として扱い、ログやレポート出力時に値を隠す（編集する）ことを指示します

これにより、ログやレポートに機密情報が表示されなくなり、安全にテストが行えます。

### 2. 新しいクエリ：IPアドレス、HTTPバージョン

Hurl 6.1.0では、HTTPレスポンスからIPアドレスを取得するクエリが追加されました：

```hurl
GET https://example.org/hello
HTTP 200
[Captures]
server_ip: ip
```

取得したIPアドレスは他の値と同様にテストできます：

```hurl
GET https://example.org/api/tests/4567
HTTP 200
[Asserts]
ip == "2001:0db8:85a3:0000:0000:8a2e:0370:733"
```

また、便利な機能として、`isIpv4`と`isIpv6`という2つの新しい述語も追加されました：

```hurl
GET https://example.org/foo
[Options]
ipv6: true
HTTP 200
[Asserts]
ip isIpv6
```

IPアドレスのフォーマットチェックには文字列値に対して以下のように使用することもできます：

```hurl
GET https://example.org/api/endpoint
HTTP 200
[Asserts]
jsonpath "$.server_ip" isIpv4
```

さらに、HTTPバージョンをテストするための`version`クエリも追加されました：

```hurl
GET https://example.org/http3
HTTP 200
[Asserts]
version == "3"

GET https://example.org/http2
HTTP 200
[Asserts]
version toFloat >= 2.0
```

### 3. 新しいフィルター：base64のエンコード/デコード、toString

Hurl 6.1.0では、データを変換するための新しいフィルターが追加されました：

- `base64Encode`/`base64Decode`：Base64エンコーディングでデータをエンコード/デコードします

```hurl
GET https://example.org/api
HTTP 200
[Asserts]
jsonpath "$.token" base64Decode == hex,e4bda0e5a5bde4b896e7958c;
```

- `toString`：値を文字列に変換します

```hurl
GET https://example.org/foo
HTTP 200
[Asserts]
status toString matches /(200|204)/
```

### 4. より多くのcurlオプション

最後に、Hurl 6.1.0では`--header`オプションが追加され、実行するすべてのリクエストに特定のHTTPヘッダーを追加できるようになりました：

```bash
$ hurl --header 'x-header-b:baz' --header 'x-header-c:qux' foo.hurl
```

## Hurlを使うメリット

Hurlを使う主なメリットは：

1. **シンプルな構文** - プレーンテキストなので学習コストが低く、バージョン管理も容易
2. **強力なアサーション機能** - JSONPath、XPathなど様々な方法でレスポンスを検証可能
3. **curlの機能を継承** - 信頼性の高いHTTPエンジンを利用
4. **CI/CDとの親和性** - 自動テストに組み込みやすい
5. **レポート機能** - テスト結果をHTML、JSON、JUnit、TAPなどの形式で出力可能

## まとめ

Hurlは、HTTPリクエストをシンプルにテストできるツールで、特にAPIテストや自動化が必要な場面で活躍します。バージョン6.1.0では、機密情報の保護、新しいクエリやフィルター、より多くのcurlオプションが追加され、さらに使いやすくなりました。

シンプルなテキスト形式でHTTPリクエストを定義でき、強力なアサーション機能を備えているため、APIの動作確認やテスト自動化に最適です。また、CI/CDパイプラインとの統合も容易です。

APIを開発・テストする機会がある方は、ぜひHurlを試してみてください！

## 参考リンク

- 公式サイト: [https://hurl.dev](https://hurl.dev)
- GitHubリポジトリ: [https://github.com/Orange-OpenSource/hurl](https://github.com/Orange-OpenSource/hurl)
- 公式ドキュメント: [https://hurl.dev/docs/manual.html](https://hurl.dev/docs/manual.html)
- リリースノート: [https://github.com/Orange-OpenSource/hurl/releases](https://github.com/Orange-OpenSource/hurl/releases)