यदि आप किसी वेबसाइट से जानकारी प्राप्त करना चाहते हैं, या यदि आप फ़ॉर्म जमा करना चाहते हैं, फ़ाइलें अपलोड करना चाहते हैं, आदि।
आपको एक HTTP अनुरोध भेजना होगा और फिर प्रतिक्रिया को संसाधित करना होगा।
इस लेख में आप सीखेंगे कि कैसे :
- नेट/http का उपयोग करके एक साधारण HTTP अनुरोध करें
- एसएसएल अनुरोध भेजें
- पोस्ट अनुरोध का उपयोग करके डेटा सबमिट करें
- कस्टम हेडर भेजें
- अपनी स्थिति के लिए सर्वश्रेष्ठ HTTP क्लाइंट चुनें
चलो यह करते हैं!
HTTP अनुरोध कैसे भेजें
रूबी एक अंतर्निहित http क्लाइंट के साथ आता है, इसे नेट/http कहा जाता है और आप इसका उपयोग किसी भी प्रकार के अनुरोध को भेजने के लिए कर सकते हैं।
यह रहा एक नेट/http उदाहरण :
require 'net/http'
Net::HTTP.get('example.com', '/index.html')
यह पृष्ठ की HTML सामग्री के साथ एक स्ट्रिंग लौटाएगा।
लेकिन अक्सर आप HTML सामग्री से अधिक चाहते हैं।
जैसे HTTP प्रतिसाद स्थिति ।
प्रतिक्रिया की स्थिति के बिना आप नहीं जानते कि आपका अनुरोध सफल हुआ या विफल हुआ।
आप इसे इस तरह प्राप्त करते हैं :
response = Net::HTTP.get_response('example.com', '/')
response.code
# 200
अब यदि आप प्रतिक्रिया सामग्री चाहते हैं तो आप body . को कॉल करें विधि:
response.body
HTTParty Gem का उपयोग कैसे करें
ऐसे कई रत्न हैं जो आपके लिए चीजों को आसान बना सकते हैं।
इन्हीं रत्नों में से एक है httparty.
यहां इसका उपयोग करने का तरीका बताया गया है :
require 'httparty'
response = HTTParty.get('http://example.com')
response.code
# 200
response.body
# ...
HTTP रत्न का उपयोग करने के लाभ:
- इसका उपयोग करना आसान है।
- कोई अलग
get_responseनहीं है विधि,getआपको पहले से ही एक प्रतिक्रिया वस्तु देता है। - जैसा कि आप अगले भाग में देखेंगे, वे एसएसएल अनुरोध को पारदर्शी बनाते हैं
SSL अनुरोध भेजना
यदि आप net/http . के साथ SSL अनुरोध भेजने का प्रयास करते हैं :
Net::HTTP.get_response("example.com", "/", 443)
आपको मिलता है:
Errno::ECONNRESET: Connection reset by peer
इसके बजाय आपको यह करना होगा:
net = Net::HTTP.new("example.com", 443)
net.use_ssl = true
net.get_response("/")
अपने आप को कुछ काम बचाएं और एक रत्न का उपयोग करें 🙂
पोस्ट अनुरोध के साथ डेटा कैसे सबमिट करें
GET अनुरोध का उपयोग जानकारी का अनुरोध करने . के लिए किया जाता है ।
जैसे कोई इमेज डाउनलोड करना, css, Javascript…
लेकिन अगर आप जानकारी सबमिट करना चाहते हैं तो POST अनुरोध का उपयोग करें ।
यहां एक उदाहरण दिया गया है:
HTTParty.post("http://example.com/login", body: { user: "test@example.com", password: "chunky_bacon" })
फ़ाइल अपलोड करने के लिए आपको एक मल्टीपार्ट अनुरोध की आवश्यकता होगी , जो HTTParty द्वारा समर्थित नहीं है।
आप बाकी क्लाइंट रत्न का उपयोग कर सकते हैं:
require 'rest-client'
RestClient.post '/profile', file: File.new('photo.jpg', 'rb')
या फैराडे रत्न:
require 'faraday'
conn =
Faraday.new do |f|
f.request :multipart
f.request :url_encoded
f.adapter :net_http
end
file_io = Faraday::UploadIO.new('photo.jpg', 'image/jpeg')
conn.post('http://example.com/profile', file: file_io)
कस्टम HTTP शीर्षलेख कैसे भेजें
आप HTTP अनुरोध के साथ कस्टम हेडर भेज सकते हैं।
इससे आपको आपके अनुरोध के साथ अतिरिक्त डेटा भेजने में मदद मिलती है , सहित:
- कुकीज़
- उपयोगकर्ता-एजेंट
- कैशिंग प्राथमिकताएं
- सामग्री-प्रकार
- स्वीकार करें (JSON वापस पाने के लिए, या कुछ और)
यहां बताया गया है:
Faraday.new('http://example.com', headers: { 'User-Agent' => 'test' }).get
मैं एक फैराडे ऑब्जेक्ट बना रहा हूं (new . का उपयोग करके) ), फिर कॉल करके get उस पर।
या आप ऐसा कुछ कर सकते हैं :
Faraday.post(
"https://example.com/login/oauth/access_token",
URI.encode_www_form(
code: params[:code],
client_id: ENV["example_client_id"],
client_secret: ENV["example_client_secret"],
),
{
"Content-Type" => "application/x-www-form-urlencoded",
"Accept" => "application/json"
}
)
जो OAuth प्रकार के अनुरोधों के लिए बहुत अच्छा काम करता है।
सर्वश्रेष्ठ रूबी HTTP क्लाइंट चुनना
रूबी में कई HTTP क्लाइंट उपलब्ध हैं।
लेकिन आपको किसे चुनना चाहिए?
यह निर्णय लेने में आपकी मदद करने के लिए मैंने आपके लिए एक तुलना तालिका तैयार की है।
यह रहा :
| रेपो | सितारे | RECENT_COMMIT_COUNT | <थ>LAST_COMMITLATEST_RELEASE | CREATED_DATE | |
|---|---|---|---|---|---|
| लॉस्टिसलैंड/फैराडे | 4817 | 26 | 2020-07-09 09:43:09 | 2020-03-29 13:46:47 | 2009-12-10 17:14:55 |
| रेस्ट-क्लाइंट/रेस्ट-क्लाइंट | 4913 | 0 | 2019-08-25 21:41:17 | 2019-08-21 22:50:21 | 2009-12-07 19:34:29 |
| टाइफियस/टाइफियस | 3739 | 2 | 2020-05-17 19:33:54 | 2020-01-15 16:24:17 | 2009-02-18 23:14:50 |
| jnunemaker/httparty | 5220 | 11 | 2020-06-10 18:40:13 | 2020-06-10 18:40:13 | 2008-07-28 20:55:11 |
| एक्सकॉन/एक्सकॉन | 1018 | 14 | 2020-06-30 11:30:12 | 2020-06-17 12:07:02 | 2009-10-25 17:50:46 |
| httprb/http | 2623 | 13 | 2020-03-30 12:34:38 | 2020-02-26 17:33:37 | 2011-10-06 04:19:10 |
लोकप्रियता को देखते हुए और इन रत्नों की देखभाल कितनी अच्छी तरह से की जाती है, यह सभी विकल्पों के मूल्यांकन में एक अच्छा पहला कदम है।
लेकिन उनके बीच तकनीकी अंतर क्या हैं?
इनमें से कई रत्न नेट/http लाइब्रेरी के आसपास के रैपर हैं :
- एक्सकॉन
- httpपार्टी
- बाकी ग्राहक
जबकि फैराडे एक एडेप्टर रत्न है, यह विभिन्न कार्यान्वयनों का उपयोग कर सकता है।
और टाइफियस सी libcurl पुस्तकालय के चारों ओर एक आवरण है।
मल्टी-थ्रेडिंग के लिए टाइफियस
टाइफियस कोई समवर्ती कोड लिखे बिना समवर्ती अनुरोधों का समर्थन करता है।
यदि आप प्रति सेकंड अपने अनुरोधों को अधिकतम करना चाहते हैं तो यह टाइफियस को सबसे अच्छा विकल्प बनाता है।
मल्टी-थ्रेडिंग के साथ टाइफियस का उपयोग करने के लिए:
require 'typhoeus'
hydra = Typhoeus::Hydra.hydra
request = Typhoeus::Request.new("https://www.rubyguides.com")
hydra.queue(request)
hydra.queue(request)
hydra.run
अनुकूलता के लिए फैराडे रत्न
फैराडे आपको नेट/एचटीटीपी, टाइफियस, या यहां तक कि रेस्ट-क्लाइंट सभी एक ही इंटरफ़ेस से तक किसी भी कार्यान्वयन को चुनने की अनुमति देता है। ।
यह डिफ़ॉल्ट रूप से नेट/http पर है, लेकिन आप इसे इस तरह बदल सकते हैं:
Faraday.default_adapter = :typhoeus
फैराडे के बारे में एक और दिलचस्प बात यह है कि यह मिडलवेयर को सपोर्ट करता है।
मिडलवेयर एक प्लगइन की तरह है जो आपको एक विशिष्ट तरीके से अनुरोध या प्रतिक्रिया को संशोधित करने में मदद करता है।
उदाहरण :
require 'faraday_middleware'
client =
Faraday.new do |f|
f.response :json
f.adapter :net_http
end
client.get('https://api.github.com/repos/vmg/redcarpet/issues')
यह मिडलवेयर प्रतिक्रिया को JSON के रूप में स्वचालित रूप से पार्स करेगा।
यदि आप JSON को पार्स करने के बजाय भेजना चाहते हैं, तो f.request :json का उपयोग करें इसके बजाय f.response :json ।
फैराडे वीडियो
बोनस:अपने HTTP अनुरोधों को कैसे डिबग करें
यदि आप यह देखना चाहते हैं कि आपका कोड वास्तव में क्या भेज रहा है ताकि आप सुनिश्चित कर सकें कि यह ठीक से काम कर रहा है…
...तो मेरे पास आपके लिए एक अच्छी छोटी सी तरकीब है।
आप इस वन-लाइनर का उपयोग कर सकते हैं:
ruby -rsocket -e "trap('SIGINT') { exit }; Socket.tcp_server_loop(8080) { |s,_| puts s.readpartial(1024); puts; s.puts 'HTTP/1.1 200'; s.close }
यह पोर्ट 8080 पर एक सर्वर बनाता है जो इसे प्राप्त होने वाली हर चीज को प्रिंट करता है, एक HTTP स्थिति कोड देता है और फिर कनेक्शन बंद कर देता है।
आप localhost:8080 के खिलाफ अनुरोध भेज सकते हैं उन्हें देखने के लिए।
इसे पसंद करें :
Faraday.new('http://localhost:8080', headers: { 'User-Agent' => 'test', 'foo' => '1234' }).get
# GET / HTTP/1.1
# User-Agent: test
# Foo: 1234
# Accept-Encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
# Accept: */*
# Connection: close
# Host: localhost:8080
अन्य विकल्पों में httplog जैसे रत्न का उपयोग करना, या mitmproxy जैसे टूल का उपयोग करना शामिल है।
सारांश
आपने सीखा कि सभी प्रकार के HTTP अनुरोध कैसे भेजें, मूल जानकारी का अनुरोध करने के लिए प्राप्त करें . से शुरू करें , जानकारी सबमिट करने के POST अनुरोध पर ।
आपने HTTP अनुरोधों के साथ काम करने के लिए सबसे लोकप्रिय रूबी रत्नों का अवलोकन देखा है। मेरा पसंदीदा है faraday लचीलेपन के कारण यह ऑफ़र करता है, लेकिन अगर यह आपकी ज़रूरतों को बेहतर ढंग से फिट करता है तो बेझिझक कोई दूसरा रत्न चुनें।
अगर आपको यह पोस्ट अच्छी लगी हो तो कृपया इसे अपने दोस्तों के साथ शेयर करें ताकि वे भी इसका आनंद उठा सकें 🙂
पढ़ने के लिए धन्यवाद!