Net::HTTP.get()https URLに使用しようとしています:
@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())
ただし、結果を印刷しようとすると、次の結果が得られます。
URI :: HTTPSを文字列に変換できません
どうしたんだ?Ruby 1.8.7(OS X)を使用しています
回答:
元の答え:
uri = URI.parse("https://example.com/some/path")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
@data = http.get(uri.request_uri)
コメントで指摘されているように、これはよりエレガントです:
require "open-uri"
@data = URI.parse("https://example.com/some/path").read
URI.parse(uri_string).read代わりに使用すると、とても美しく機能します。
VERIFY_NONE意味ですか?代わりに何をすべきでしょうか?
require 'open-uri'ために必要です。
編集:私のアプローチは機能しますが、@ jason-yeoのアプローチははるかに簡単です。
2.1.2の時点で、文書化された方法として推奨されるものは次のとおりです(文書を直接引用)。
HTTPSは、#use_ssl =によってHTTP接続に対して有効になります。
uri = URI('https://secure.example.com/some_path?query=string') Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| request = Net::HTTP::Get.new uri response = http.request request # Net::HTTPResponse object end以前のバージョンのRubyでは、HTTPSを使用するために「net / https」が必要でした。これはもはや真実ではありません。
Net::HTTP.get、URIオブジェクトにhttpsURLが渡された場合、HTTPS取得要求を実行するのに十分です。私の答えを参照してください:stackoverflow.com/a/36543895/382740。
Ruby 2.0.0以降でhttpsは、HTTPS getリクエストを実行するには、URLを指定してuriオブジェクトを渡すだけで十分です。
uri = URI('https://encrypted.google.com')
Net::HTTP.get(uri)
有効期限が切れた証明書を持つドメインでgetリクエストを実行することで、これを確認できます。
uri = URI('https://expired.badssl.com/')
Net::HTTP.get(uri)
# OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
これは、Ruby2.0.0でのこのコミットによって導入されました。
get_response呼び出されるメソッド、Net::HTTP.get方法は、設定し :use_sslたときにtrueにuri.scheme「https」のです。
免責事項:質問はRuby 1.8.7に関するものであることは理解していますが、これは「https ruby」を検索したときの検索結果の上位数の1つであるため、とにかく答えることにしました。
http.use_ssl = true実際にsslを使用するように強制するために電話をかけなければならなかったので、物事は順調に進みました。
これは次のようになります。
uri.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)
IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path )、SSL検証を無効にするために使用する必要がありました。私たちの場合、セキュリティは問題ではなく、サーバーは制御不能であり、一時的な解決策でした。