रूबी ऑन रेल्स का उपयोग करके HTTP अनुरोध कैसे करें?


235

मैं दूसरी वेबसाइट से जानकारी लेना चाहूंगा। इसलिए (शायद) मुझे उस वेबसाइट (मेरे मामले में HTTP जीईटी अनुरोध) के लिए एक अनुरोध करना चाहिए और प्रतिक्रिया प्राप्त करनी चाहिए।

मैं इसे रूबी ऑन रेल्स में कैसे बना सकता हूं?

यदि यह संभव है, तो क्या यह मेरे नियंत्रकों में उपयोग करने के लिए एक सही तरीका है?

जवाबों:


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
यहाँ 'रीक' का क्या अर्थ है?
साठ

18
इसका अर्थ है अनुरोध
आर्थर कॉल

1
ऐसा लगता है कि यह एक अवरुद्ध अनुरोध हो सकता है, यह नहीं होगा?
स्कॉट ईसेनबर्ग

एपि की को कहां लगाएं?
user1735921

1
बस यह जोड़ना कि www। आवश्यक नहीं होना चाहिए, यह आमतौर पर नहीं है।
जैकहेसकेबोर्ड 5

111

नेट :: HTTP रूबी में बनाया गया है, लेकिन इसका सामना करते हैं, अक्सर इसकी बोझिल 1980 के दशक की शैली का उपयोग करना आसान नहीं होता है और उच्च स्तरीय विकल्प की कोशिश करते हैं:


4
या ActiveResource, जो रेल के साथ आता है!
मर्नेन लाईबो-कोसर 14'14

8
मैं ऐसा करने के खिलाफ सावधानी बरतना चाहता हूं क्योंकि आप अपने रेल एप्लिकेशन पर अधिक निर्भरता जोड़ेंगे। अधिक निर्भरता का अर्थ है अधिक मेमोरी खपत और संभावित रूप से बड़ी हमले की सतह। उपयोग करना Net::HTTPबोझिल है लेकिन व्यापार बंद नहीं है।
जेसन यियो

3
यह स्वीकृत उत्तर होना चाहिए। जब आप सिर्फ बहुत सारे रत्न स्थापित कर सकते हैं तो प्रोग्राम क्यों?
बजे

5
@ जेसोयियो दृढ़ता से असहमत हैं। निर्भरता का परिचय देने का मतलब है कि आप पहिया को सुदृढ़ नहीं करते हैं, और आप दूसरों द्वारा पहले ही की गई मेहनत से लाभान्वित होते हैं। यदि कोई रत्न मौजूद है जो आपके जीवन को आसान बनाता है, तो आमतौर पर इसका उपयोग न करने का कोई अच्छा कारण नहीं है।
मार्नैन लाइबो-कोसर

1
@JasonYeo लेफ्टपैड गाथा केवल इसलिए हुई क्योंकि NPM ने अपनी रिपॉजिटरी को खराब तरीके से चलाया और लेखक को उसके सभी पैकेज हटा दिए। उचित रूप से प्रबंधित पैकेज प्रतिनिधि ऐसा नहीं करते हैं (और वैसे भी, यह ओएसएस है, इसलिए आप चाहें तो आसानी से दर्पण कर सकते हैं)। यही है, बायीं ओर की गाथा सामान्य रूप से निर्भरता को शुरू करने के खिलाफ तर्क नहीं है, बल्कि रेपो को खराब तरीके से प्रबंधित करने के खिलाफ है। मैं आपके दूसरे बिंदु से सहमत हूं, कि एक बड़ी निर्भरता जो आपके ज़रूरत से ज़्यादा काम करती है, वह उस मूल्य के लिए ओवरकिल हो सकती है।
मार्नेन लाईबो-कोसर

92

OpenURI सबसे अच्छा है; यह उतना ही सरल है

require 'open-uri'
response = open('http://example.com').read

10
यह चेतावनी देना महत्वपूर्ण है, कि open-uriपुनर्निर्देश का पालन नहीं होगा।
यगौर

3
@ अयागर जो महान है, दुर्भावनापूर्ण पुनर्निर्देश को रोकता हैfile:///etc/passwd
15

1
कृपया ध्यान दें, कि यह कनेक्शन बंद नहीं करेगा। उपयोग stackoverflow.com/a/4217269/820501
ShockwaveNN


13

मैं नेट पर HTTPclient पसंद करते हैं :: HTTP।

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

आपका क्या मतलब है, आपको अन्य वेबसाइट के मापदंडों को पढ़ने की आवश्यकता है? यह भी कैसे संभव होगा? आप क्या हासिल करने का प्रयास कर रहे हैं?
मार्नेन लाइबो-कोसर

8

URL की सामग्री को हथियाने के लिए मेरे पसंदीदा दो तरीके OpenURI या Typhoeus हैं

OpenURI क्योंकि यह हर जगह है, और Typhoeus क्योंकि यह बहुत लचीला और शक्तिशाली है।


8

यहाँ वह कोड है जो काम करता है अगर आप प्रॉक्सी के पीछे REST एपि कॉल कर रहे हैं:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.