すごーく久しぶりに、Ruby で HTTP アクセスするってことをやった。使い慣れた httpclient を使ったんだけど、こんなエラーが出た。
C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/httpclient-2.8.3/lib/httpclient/ssl_socket.rb:103:in `connect': SSL_connect returned=1 errno=0 peeraddr=[2606:4700:3032::ac43:8791]:443 state=error: certificate verify failed (certificate has expired) (OpenSSL::SSL::SSLError) (以下略)
SSLのエラーだ。
ググって調べてみると、httpclient gem は信頼できる証明書を独自に持っていてそれがもうメンテされていない、ということが解った。
上の記事では、システムのデフォルトの証明書を利用することで回避する方法も書かれている。けど、RubyGems.org をみると httpclient gem の最後のリリースは 2016/9 で、これはもう他のライブラリにのりかえるべきだろう。
で、さらにググって調べたところ、http という gem の評判がよさげに見えたのでこれを使ってみることにした。こんな名前よく空いてたな。
使い方は GitHub の Wiki にまとまっている。
httpclient みたいにインスタンスを作る必要がなくて 、require "http"
したら HTTP
モジュールの関数が使える。例えば GET
の場合はこう。
irb(main):001:0> require "http" => true irb(main):002:0> res = HTTP.get("https://blog.panicblanket.com") => #<HTTP::Response/1.1 200 OK {"Date"=>"Sat, 06 Jan 2024 20:51:15 GMT", "Content-Type"=>"text/...
レスポンスのコードは #code
、ボディは #to_s
で取得できる。
irb(main):003:0> res.code => 200 irb(main):004:0> res.to_s => "<!DOCTYPE html>\n\n<html lang=\"ja\">\n\n\t<head>\n\n\t\t<meta http-equiv=\"content-type\" content=\"text/html\" charset=\"UTF-8\" />\n\t\t<meta (以下略)
こんな感じ。
GET
、POST
、 PUT
、DELETE
などの HTTP
メソッドの他にも WEBDAV
なんかもサポートしてる。使いやすそうだ。