httpsURLにNet :: HTTP.getを使用する


84

Net::HTTP.get()https URLに使用しようとしています:

@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())

ただし、結果を印刷しようとすると、次の結果が得られます。

URI :: HTTPSを文字列に変換できません

どうしたんだ?Ruby 1.8.7(OS X)を使用しています


参考までに、証明書の問題が発生したサードパーティのサーバーに一時的に接続していたためIO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path )、SSL検証を無効にするために使用する必要がありました。私たちの場合、セキュリティは問題ではなく、サーバーは制御不能であり、一時的な解決策でした。
— Joshua Pinter

回答:


156

元の答え:

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

7
私が尋ねたものに対する答えなので、これを答えとしてあげますが、本当の答えは、私がこれに間違った方法でアプローチしていることを指摘することです。URI.parse(uri_string).read代わりに使用すると、とても美しく機能します。
— トニースターク

2
どういうVERIFY_NONE意味ですか?代わりに何をすべきでしょうか?
— ジョナサンアラード2011

1
これは、証明書の信憑性が無視されることを意味するフラグですが、これは少し前のことなので、なぜ設定する必要があるのか​​わかりません。
— stef 2012年

2
@ frabcus、.readが機能するrequire 'open-uri'ために必要です。
— Josh D

1
OPの質問には、SSL検証が望ましくないことを意味するものは何もないのに、なぜVERIFY_NONEを提案するのですか?
— アレックス

35

編集:私のアプローチは機能しますが、@ 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」が必要でした。これはもはや真実ではありません。


6
本当じゃない。Ruby 2.0.0以降Net::HTTP.get、URIオブジェクトにhttpsURLが渡された場合、HTTPS取得要求を実行するのに十分です。私の答えを参照してください:stackoverflow.com/a/36543895/382740。
— Jason Yeo

19

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つであるため、とにかく答えることにしました。


4
データポイントとして、私はこれがルビー2.2.10では真実ではないことを発見しました。ポート443で接続を開きましたが、SSLを使用しませんでした。もちろん、外部サーバーはそれとは何の関係もなく、応答なしで接続を閉じたため、私の側には多くの歯が食い込んでいました。http.use_ssl = true実際にsslを使用するように強制するために電話をかけなければならなかったので、物事は順調に進みました。
— David Hempy 2018

4

これは次のようになります。

uri.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)

...働いていたが、現在は外部のAPIは、私はHTTPSポートにプレーンなHTTPリクエストを送信したことを不平を言っていること
— トニー・スターク

ハハ、右;)以下のソリューションStefが提供したものを参照してください、それは機能するはずです
— Vlad Khomich 2011

そうではありません。「undefinedmethodʻuse_ssl = '」というエラーが表示されます
— Tony Stark

2
'net / https'も要求してみてください
— Vlad Khomich 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.