https URL에 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대신 사용 하면 매우 아름답게 작동합니다.
Tony Stark

2
무엇을 VERIFY_NONE의미합니까? 대신 무엇을해야합니까?
Jonathan Allard

1
이것은 인증서의 정확성이 무시된다는 것을 의미하는 플래그입니다.하지만 이것은 얼마 전이어서 왜 설정해야하는지 잘 모르겠습니다.
stef

2
@frabcus, require 'open-uri'.read가 작동 하려면 필요합니다 .
Josh D

1
OP의 질문에는 SSL 확인이 바람직하지 않다는 것을 암시하는 것이 없습니다. 그런데 왜 VERIFY_NONE을 제안합니까?
Alex

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.getURI 개체에 httpsURL 이 전달되면 HTTPS 가져 오기 요청을 수행하기에 충분합니다 . 내 대답을 참조하십시오 : stackoverflow.com/a/36543895/382740 .
Jason Yeo

19

Ruby 2.0.0 이상에서는 httpsURL이 있는 uri 객체를 전달하는 것만으로도 HTTPS 가져 오기 요청을 수행 할 수 있습니다.

uri = URI('https://encrypted.google.com')
Net::HTTP.get(uri)

만료 된 인증서가 있는 도메인 에서 가져 오기 요청을 수행하여이를 확인할 수 있습니다 .

uri = URI('https://expired.badssl.com/')
Net::HTTP.get(uri)
# OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed

커밋 은 Ruby 2.0.0에서 도입되었습니다 .

get_response에 의해 호출 방법, Net::HTTP.get방법은 설정 :use_ssl (가) 때 true로 uri.scheme"HTTPS"입니다.

면책 조항 : 질문이 Ruby 1.8.7에 대한 것이라는 것을 이해합니다. 그러나 이것은 "https ruby"를 검색 할 때 가장 많이 검색되는 몇 안되는 검색 결과 중 하나이기 때문에 어쨌든 대답하기로 결정했습니다.


4
데이터 포인트로서 나는 이것이 루비 2.2.10에서 사실이 아니라는 것을 발견했습니다. 포트 443에서 연결을 열었지만 SSL을 사용하지 않았습니다. 물론, 외국 서버는 그것과 아무 관련이 없을 것이고, 응답없이 연결을 닫았고, 내 쪽에서 많은 이빨을 갈고 닦았습니다. http.use_ssl = true실제로 ssl을 사용하도록 강제 로 전화 를 걸어야했고 상황이 원활하게 진행되었습니다.
David Hempy

4

이것은 다음과 같아야합니다.

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

그게 일,하지만 지금은 외부 API는 내가 HTTPS 포트에 일반 HTTP 요청 ... 보낸 불평
토니 스타크를

haha, right;) 아래 솔루션 Stef 제공, 작동해야 함
Vlad Khomich 2011

그것은, 내가 "정의되지 않은 메서드`USE_SSL = '"라는 오류가 발생하지 않습니다
토니 스타크

2
또한 필요하려고 '순 / HTTPS'
블라드 Khomich
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.