Ruby on Rails를 사용하여 HTTP 요청을하는 방법은 무엇입니까?


235

다른 웹 사이트에서 정보를 얻고 싶습니다. 따라서 (아마도) 해당 웹 사이트 (내 경우에는 HTTP GET 요청)에 요청하고 응답을 받아야합니다.

Ruby on Rails에서 어떻게 만들 수 있습니까?

가능하다면 컨트롤러에서 사용하는 올바른 방법입니까?

답변:


329

루비 Net::HTTP클래스를 사용할 수 있습니다 :

require 'net/http'

url = URI.parse('http://www.example.com/index.html')
req = Net::HTTP::Get.new(url.to_s)
res = Net::HTTP.start(url.host, url.port) {|http|
  http.request(req)
}
puts res.body

1
여기서 '요구 사항'은 무엇을 의미합니까?
sixty4bit

18
그것은 요청을 의미
Arthur Collé

1
이것이 차단 요청 일 수있는 것 같습니까?
Scott Eisenberg

API 키를 어디에 넣을까요?
user1735921

1
그냥 www를 추가하면됩니다. 필요하지 않아야하며 일반적으로 필요하지 않습니다.
JackHasaKeyboard

111

Net :: HTTP는 루비에 내장되어 있지만, 까다로운 1980 년대 스타일을 사용 하지 않고 더 높은 수준의 대안을 시도하는 것이 더 쉬운 경우 가 있습니다.


4
또는 Rails와 함께 제공되는 ActiveResource!
Marnen Laibow-Koser

8
rails 앱에 더 많은 종속성을 추가하므로 그렇게하지 않도록주의하고 싶습니다. 더 많은 종속성은 더 많은 메모리 소비와 잠재적으로 더 큰 공격 영역을 의미합니다. 사용 Net::HTTP은 번거롭지 만 그만한 가치는 없습니다.
Jason Yeo

3
이것이 정답입니다. 많은 보석을 설치할 수 있는데 왜 프로그램입니까?
omikes

5
@JasonYeo 매우 동의하지 않습니다. 의존성을 도입한다는 것은 바퀴를 재발 명하지 않으며 다른 사람들이 이미 해낸 노력의 이점을 누릴 수 있음을 의미합니다. 당신의 인생을 더 쉽게 만들어주는 보석이 있다면, 그것을 사용하지 않는 좋은 이유는 없습니다.
Marnen Laibow-Koser

1
@JasonYeo 왼쪽 패드 사가는 NPM이 저장소를 제대로 실행하지 않아서 작성자가 모든 패키지를 삭제하도록했기 때문에 발생했습니다. 올바르게 관리되는 패키지 저장소는 그렇게하지 않습니다 (그리고 어쨌든 OSS이므로 원하는 경우 쉽게 미러링 할 수 있습니다). 즉, 왼쪽 패드 사가는 일반적으로 종속성을 도입하는 것이 아니라 레포를 잘못 관리하는 것에 대한 논쟁이 아닙니다. 나는 당신이 필요로하는 것보다 더 많은 것을하는 큰 의존성이 그것이 제공하는 가치를 과도하게 사용할 수 있다는 다른 관점에 동의합니다.
Marnen Laibow-Koser 2016 년


82
require 'net/http'
result = Net::HTTP.get(URI.parse('http://www.example.com/about.html'))
# or
result = Net::HTTP.get(URI.parse('http://www.example.com'), '/about.html')

13

Net :: HTTP보다 httpclient 를 선호합니다 .

client = HTTPClient.new
puts client.get_content('http://www.example.com/index.html')

서비스의 클라이언트 인 클래스를 만드는 경우 HTTParty를 사용하는 것이 좋습니다. 필요한 것의 90 %를 제공하는 편리한 믹스 인입니다. 예제 에서 Google 및 Twitter 클라이언트가 얼마나 짧은 지 확인하십시오 .

그리고 두 번째 질문에 대답하기 위해 : 아니오, 나는이 기능을 컨트롤러에 넣지 않을 것입니다-가능하면 모델을 사용하여 가능하면 특정 내용을 캡슐화하고 (아마 HTTParty를 사용하여) 컨트롤러에서 간단히 호출하십시오.


URL에 안전하게 매개 변수를 전달하는 방법은 무엇입니까? 예 : http : //www.example.com/index.html? param1 = test1 & param2 = test2 그런 다음 다른 웹 사이트 매개 변수를 읽고 응답을 준비해야합니다. 그러나 매개 변수를 어떻게 읽을 수 있습니까?
user502052

다른 웹 사이트의 매개 변수를 읽어야합니까? 어떻게 가능할까요? 당신은 무엇을 달성하려고합니까?
Marnen Laibow-Koser

8

URL의 내용을 잡는 가장 좋아하는 두 가지 방법은 OpenURI 또는 Typhoeus 입니다.

OpenURI는 어디에나 있기 때문에, Typhoeus는 매우 유연하고 강력하기 때문에.


8

프록시 뒤에서 REST API 호출을 수행하는 경우 작동하는 코드는 다음과 같습니다.

require "uri"
require 'net/http'

proxy_host = '<proxy addr>'
proxy_port = '<proxy_port>'
proxy_user = '<username>'
proxy_pass = '<password>'

uri = URI.parse("https://saucelabs.com:80/rest/v1/users/<username>")
proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_pass)

req = Net::HTTP::Get.new(uri.path)
req.basic_auth(<sauce_username>,<sauce_password>)

result = proxy.start(uri.host,uri.port) do |http|
http.request(req)
end

puts result.body
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.