# Crystal で HTTP リクエストしてみる


published: 2026-11-07

勉強がてら Crystal lang に触れました。
試しに HTTP リクエストしてみます。


## インストール

Crystal のインストールは HomeBrew で行えます。


```bash
brew install crystal

```

## バージョン

![version.png](https://lab.enuesaa.dev/prototype/crystal-http-request-try/version.png)

## Links

- [https://crystal-lang.org/](https://crystal-lang.org/)
- [https://crystal-lang.org/install/#macos](https://crystal-lang.org/install/#macos)
## コード

### `mycurl.cr`

```cr
require "http/client"
require "option_parser"

headers = HTTP::Headers.new
include_headers = false
url = ""

# parse
OptionParser.parse do |p|
  p.banner = "Usage: mycurl <URL>"

  p.on("-H HEADER", "Add a request header") do |h|
    name, _, value = h.partition(':')
    headers[name.strip] = value.strip
  end
  p.on("-i", "Print response headers") do
    include_headers = true
  end
  p.on("-h", "Print help message") do
    puts p
    exit
  end

  p.unknown_args do |args|
    url = args.first? || abort(p.to_s)
  end

  p.invalid_option { |flag| abort "Invalid option: #{flag}\n#{p}" }
  p.missing_option { |flag| abort "Missing argument for: #{flag}\n#{p}" }
end

# make a http request
response = HTTP::Client.get(url, headers: headers)

# print
if include_headers
  puts "#{response.version} #{response.status_code} #{response.status_message}"
  response.headers.each do |name, values|
    puts "#{name}: #{values.join(", ")}"
  end
  puts
end

print response.body

# exit
exit(1) unless response.success?

```

### memos

OptionParser でコマンドライン引数をパースします


mark: `mycurl.cr:2`

- [https://crystal-lang.org/api/1.22.2/OptionParser.html](https://crystal-lang.org/api/1.22.2/OptionParser.html)
下記のコマンドで実行できます。


```bash
crystal run mycurl.cr -- 'https://example.com' -i

```

## ビルド

ビルドします。
コマンドを実行すると `./mycurl` にバイナリが作られます。


```bash
crystal build mycurl.cr --release --no-debug

```

バイナリを実行してみます。


![run.png](https://lab.enuesaa.dev/prototype/crystal-http-request-try/run.png)

HTTP リクエストできました。


