Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में HTTP अनुरोधों के लिए अंतिम गाइड

यदि आप किसी वेबसाइट से जानकारी प्राप्त करना चाहते हैं, या यदि आप फ़ॉर्म जमा करना चाहते हैं, फ़ाइलें अपलोड करना चाहते हैं, आदि।

आपको एक 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('https://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("https://example.com/login", body: { user: "[email protected]", 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('https://example.com/profile', file: file_io)

कस्टम HTTP शीर्षलेख कैसे भेजें

आप HTTP अनुरोध के साथ कस्टम हेडर भेज सकते हैं।

इससे आपको आपके अनुरोध के साथ अतिरिक्त डेटा भेजने में मदद मिलती है , सहित:

  • कुकीज़
  • उपयोगकर्ता-एजेंट
  • कैशिंग प्राथमिकताएं
  • सामग्री-प्रकार
  • स्वीकार करें (JSON वापस पाने के लिए, या कुछ और)

यहां बताया गया है:

Faraday.new('https://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 क्लाइंट उपलब्ध हैं।

लेकिन आपको किसे चुनना चाहिए?

यह निर्णय लेने में आपकी मदद करने के लिए मैंने आपके लिए एक तुलना तालिका तैयार की है।

यह रहा :

<थ>LAST_COMMIT
रेपो सितारे RECENT_COMMIT_COUNT LATEST_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('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 अनुरोध कैसे भेजें, मूल जानकारी का अनुरोध करने के लिए प्राप्त करें . से शुरू करें , जानकारी सबमिट करने के POST अनुरोध पर

आपने HTTP अनुरोधों के साथ काम करने के लिए सबसे लोकप्रिय रूबी रत्नों का अवलोकन देखा है। मेरा पसंदीदा है faraday लचीलेपन के कारण यह ऑफ़र करता है, लेकिन अगर यह आपकी ज़रूरतों को बेहतर ढंग से फिट करता है तो बेझिझक कोई दूसरा रत्न चुनें।

अगर आपको यह पोस्ट अच्छी लगी हो तो कृपया इसे अपने दोस्तों के साथ शेयर करें ताकि वे भी इसका आनंद उठा सकें 🙂

पढ़ने के लिए धन्यवाद!


  1. रूबी डेवलपर्स के लिए समय की जटिलता के लिए निश्चित गाइड

    समय जटिलता सबसे दिलचस्प अवधारणाओं में से एक है जिसे आप कंप्यूटर विज्ञान से सीख सकते हैं, और आपको इसे समझने के लिए किसी डिग्री की आवश्यकता नहीं है! यह दिलचस्प है क्योंकि इससे आपको यह देखने में मदद मिलती है कि कोई विशेष एल्गोरिदम या प्रोग्राम धीमा क्यों हो सकता है और इसे और तेज़ बनाने के लिए आप क्या

  1. रूबी एन्यूमरेबल मॉड्यूल के लिए एक बुनियादी गाइड (+ मेरी पसंदीदा विधि)

    एन्यूमरेबल क्या है? एन्यूमरेबल पुनरावृत्ति विधियों का संग्रह . है , एक रूबी मॉड्यूल, और जो रूबी को एक महान प्रोग्रामिंग भाषा बनाता है उसका एक बड़ा हिस्सा। एन्यूमरेबल में उपयोगी तरीके शामिल हैं जैसे : map select inject असंख्य तरीके उन्हें एक ब्लॉक देकर काम करते हैं। उस ब्लॉक में आप उन्हें बत

  1. Mac पर Android संदेशों के लिए अंतिम मार्गदर्शिका

    Mac पर Android संदेश ? असंभव लगता है, है ना? दो ब्रांडों के बीच भयंकर प्रतिस्पर्धा के साथ, ज्यादातर लोग सोचते हैं कि एंड्रॉइड और मैक एक साथ काम नहीं करेंगे। हालांकि, चूंकि Google चाहता है कि बातचीत उपयोगकर्ताओं के लिए सुविधाजनक और लचीली हो, इसलिए उन्होंने Android संदेश विकसित किए हैं। इस मैसेजिं