यदि आप किसी वेबसाइट से जानकारी प्राप्त करना चाहते हैं, या यदि आप फॉर्म सबमिट करना, फाइल अपलोड करना आदि चाहते हैं।
आपको एक HTTP रिक्वेस्ट भेजनी होगी और फिर प्रतिक्रिया को प्रोसेस करना होगा।
इस लेख में आप सीखेंगे कि कैसे:
- net/http का उपयोग करके एक सरल HTTP रिक्वेस्ट बनाएं
- SSL रिक्वेस्ट्स भेजें
- POST रिक्वेस्ट का उपयोग करके डेटा सबमिट करें
- कस्टम हेडर्स भेजें
- अपनी स्थिति के लिए सर्वश्रेष्ठ HTTP क्लाइंट चुनें
चलिए शुरू करते हैं!
HTTP रिक्वेस्ट कैसे भेजें
Ruby एक अंतर्निहित HTTP क्लाइंट के साथ आता है, इसे net/http कहा जाता है और आप इसका उपयोग किसी भी प्रकार की रिक्वेस्ट भेजने के लिए कर सकते हैं जिसकी आपको आवश्यकता है।
यहां एक net/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 जेम का उपयोग कैसे करें
कई जेम्स हैं जो आपके लिए चीजों को आसान बना सकते हैं।
इन जेम्स में से एक है httparty।
यहां इसका उपयोग कैसे करें:
require 'httparty' response = HTTParty.get('https://example.com') response.code # 200 response.body # ...
HTTP जेम का उपयोग करने के लाभ:
- यह उपयोग करने में आसान है।
- कोई अलग
get_responseमेथड नहीं है,getपहले से ही आपको एक रिस्पांस ऑब्जेक्ट देता है। - जैसा कि आप अगले भाग में देखेंगे वे SSL रिक्वेस्ट्स को पारदर्शी बनाते हैं
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("/")
अपना कुछ काम बचाएं और जेम का उपयोग करें 🙂
POST रिक्वेस्ट के साथ डेटा कैसे सबमिट करें
GET रिक्वेस्ट का उपयोग जानकारी का अनुरोध करने के लिए किया जाता है।
जैसे इमेज, CSS, जावास्क्रिप्ट डाउनलोड करना...
लेकिन यदि आप जानकारी सबमिट करना चाहते हैं तो POST रिक्वेस्ट का उपयोग करें।
यहां एक उदाहरण है:
HTTParty.post("https://example.com/login", body: { user: "test@example.com", password: "chunky_bacon" })
फाइल अपलोड करने के लिए आपको एक मल्टीपार्ट रिक्वेस्ट की आवश्यकता होगी, जो HTTParty द्वारा समर्थित नहीं है।
आप rest-client जेम का उपयोग कर सकते हैं:
require 'rest-client' RestClient.post '/profile', file: File.new('photo.jpg', 'rb')
या Faraday जेम:
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('https://example.com/profile', file: file_io)
कस्टम HTTP हेडर्स कैसे भेजें
आप HTTP रिक्वेस्ट के साथ कस्टम हेडर्स भेज सकते हैं।
यह आपको अपनी रिक्वेस्ट के साथ अतिरिक्त डेटा भेजने में मदद करता है, जिसमें शामिल हैं:
- कुकीज़
- User-agent
- कैशिंग प्राथमिकताएं
- Content-type
- Accept (JSON वापस पाने के लिए, या कुछ और)
यहां कैसे:
Faraday.new('https://example.com', headers: { 'User-Agent' => 'test' }).get
मैं एक Faraday ऑब्जेक्ट बना रहा हूँ ( 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 टाइप की रिक्वेस्ट्स के लिए बहुत अच्छा काम करता है।
सर्वश्रेष्ठ Ruby HTTP क्लाइंट चुनना
Ruby में कई HTTP क्लाइंट्स उपलब्ध हैं।
लेकिन आपको कौन सा चुनना चाहिए?
इस निर्णय लेने में आपकी मदद करने के लिए मैंने आपके लिए एक तुलना तालिका तैयार की है।
यह रही:
| REPO | STARS | RECENT_COMMIT_COUNT | LAST_COMMIT | LATEST_RELEASE | CREATED_DATE |
|---|---|---|---|---|---|
| lostisland/faraday | 4817 | 26 | 2020-07-09 09:43:09 | 2020-03-29 13:46:47 | 2009-12-10 17:14:55 |
| rest-client/rest-client | 4913 | 0 | 2019-08-25 21:41:17 | 2019-08-21 22:50:21 | 2009-12-07 19:34:29 |
| typhoeus/typhoeus | 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 |
| excon/excon | 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 |
लोकप्रियता और इन जेम्स को कितनी अच्छी तरह से बनाए रखा जाता है, इसे देखना सभी विकल्पों का मूल्यांकन करने में एक अच्छा पहला कदम है।
लेकिन उनके बीच तकनीकी अंतर क्या हैं?
इनमें से कई जेम्स net/http लाइब्रेरी के चारों ओर रैपर हैं:
- excon
- httparty
- rest client
जबकि Faraday एक एडाप्टर जेम है, यह विभिन्न कार्यान्वयनों का उपयोग कर सकता है।
और Typhoeus C libcurl लाइब्रेरी के चारों ओर एक रैपर है।
मल्टी-थ्रेडिंग के लिए Typhoeus
Typhoeus बिना किसी समवर्ती कोड लिखे समवर्ती रिक्वेस्ट्स का समर्थन करता है।
यह Typhoeus को सबसे अच्छा विकल्प बनाता है यदि आप अपने रिक्वेस्ट्स प्रति सेकंड को अधिकतम करना चाहते हैं।
Typhoeus का उपयोग मल्टी-थ्रेडिंग के साथ करने के लिए:
require 'typhoeus' hydra = Typhoeus::Hydra.hydra request = Typhoeus::Request.new("https://www.rubyguides.com") hydra.queue(request) hydra.queue(request) hydra.run
अनुकूलता के लिए Faraday जेम
Faraday आपको net/http से Typhoeus, या यहां तक कि rest-client तक सभी को एक ही इंटरफेस से चुनने की अनुमति देता है।
यह net/http को डिफ़ॉल्ट करता है, लेकिन आप इसे इस तरह बदल सकते हैं:
Faraday.default_adapter = :typhoeus
Faraday के बारे में एक और दिलचस्प बात यह है कि यह मिडलवेयर का समर्थन करता है।
मिडलवेयर एक प्लगइन की तरह है जो आपको रिक्वेस्ट या रिस्पांस को एक विशिष्ट तरीके से संशोधित करने में मदद करता है।
उदाहरण:
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.response :json के बजाय f.request :json का उपयोग करें।
Faraday वीडियो
बोनस: अपने 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('https://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 रिक्वेस्ट भेजना सीखा, बुनियादी GET जानकारी का अनुरोध करने के लिए, से POST जानकारी सबमिट करने के लिए रिक्वेस्ट तक।
आपने HTTP रिक्वेस्ट्स के साथ काम करने के लिए सबसे लोकप्रिय Ruby जेम्स का अवलोकन देखा। मेरा पसंदीदा faraday है क्योंकि यह जो लचीलापन प्रदान करता है, लेकिन बेझिझक दूसरा जेम चुनें यदि यह आपकी आवश्यकताओं के लिए बेहतर फिट बैठता है।
यदि आपको यह पोस्ट पसंद आया तो कृपया इसे अपने दोस्तों के साथ साझा करें ताकि वे भी इसका आनंद ले सकें 🙂
पढ़ने के लिए धन्यवाद!