rubyでは標準ライブラリである「net/http」を利用することで、簡単にwebサーバへのリクエストの実行・レスポンスの取得が行えます。
url = "http://hogehoge.com?p1=aaaaa&p2=テスト" #URI.escapeはマルチバイト文字等をエスケープする escape_url = URI.escape(url) #=>http://hogehoge.com?p1=aaaaa&p2=%E3%83%86%E3%82%B9%E3%83%88 #URI.parseはURI::Genericインスタンスを返す。これは与えられたURIからホスト名、ポート、パス等のメンバーを持つ。 response = Net::HTTP.get_response(URI.parse(escape_url)) #レスポンスの内容はresponse.bodyで取得できる。 puts response.body #=><html><head>…</head><body>…</body></html>
ところが、httpsで接続すると以下のような「OpenSSL::SSL::SSLError」が発生することがあります。
url = "https://hogehoge.com?p1=aaaaa&p2=テスト" escape_url = URI.escape(url) response = Net::HTTP.get_response(URI.parse(escape_url)) #=> `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
原因はNet::HTTPモジュールがクライアント側のSSL証明書が見つけられず、接続先サーバの安全性を確認できないためのようです。
そもそもSSL証明書が無いってどういうこと? というのはこちらをご覧ください。
qiita.com
接続先サーバの安全性を確認せずとにかく接続する。
url = "https://hogehoge.com?p1=aaaaa&p2=テスト" escape_url = URI.escape(url) uri = URI.parse(escape_url) #設定が必要なためNet::HTTPインスタンスを生成する。 http = Net::HTTP.new(uri.host,uri.port) #スキームにhttpsを利用 http.use_ssl=true #ここがポイント。接続先サーバの証明書が検証できなくても接続する。 http.verify_mode=OpenSSL::SSL::VERIFY_NONE #getメソッドにはリクエストURIを指定する。 #uri.request_uri => /?p1=aaaaa&p2=%E3%83%86%E3%82%B9%E3%83%88 response = http.get(uri.request_uri)
クライアントにSSL証明書を導入するためには
こちらのページをご参照ください。
d.hatena.ne.jp
- 作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/10
- メディア: 大型本
- この商品を含むブログ (22件) を見る