কম্পিউটার

রুবিতে HTTP অনুরোধের চূড়ান্ত গাইড

আপনি যদি কোনো ওয়েবসাইট থেকে তথ্য পেতে চান, অথবা আপনি যদি ফর্ম জমা দিতে চান, ফাইল আপলোড করতে চান, ইত্যাদি।

আপনাকে একটি HTTP অনুরোধ পাঠাতে হবে এবং তারপর প্রতিক্রিয়া প্রক্রিয়া করতে হবে।

এই নিবন্ধে আপনি কীভাবে করবেন তা শিখবেন :

  • নেট/http ব্যবহার করে একটি সহজ HTTP অনুরোধ করুন
  • SSL অনুরোধ পাঠান
  • একটি POST অনুরোধ ব্যবহার করে ডেটা জমা দিন
  • কাস্টম হেডার পাঠান
  • আপনার পরিস্থিতির জন্য সেরা HTTP ক্লায়েন্ট চয়ন করুন

এটা করা যাক!

কিভাবে একটি HTTP অনুরোধ পাঠাবেন

রুবি একটি অন্তর্নির্মিত http ক্লায়েন্টের সাথে আসে, এটিকে নেট/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

How to use HTTPparty Gem

অনেক রত্ন আছে যেগুলো আপনার জন্য সহজ করে দিতে পারে।

এই রত্নগুলির মধ্যে একটি হল 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("/")

নিজেকে কিছু কাজ বাঁচান এবং একটি রত্ন ব্যবহার করুন 🙂

কিভাবে একটি পোস্টের অনুরোধের সাথে ডেটা জমা দিতে হয়

একটি GET অনুরোধ তথ্যের অনুরোধ করতে ব্যবহৃত হয় .

যেমন একটি ছবি ডাউনলোড করা, css, javascript…

কিন্তু আপনি যদি তথ্য জমা দিতে চান তাহলে একটি POST অনুরোধ ব্যবহার করুন .

এখানে একটি উদাহরণ:

HTTParty.post("https://example.com/login", body: { user: "test@example.com", password: "chunky_bacon" })

একটি ফাইল আপলোড করতে আপনার একটি মাল্টিপার্ট অনুরোধের প্রয়োজন হবে৷ , যা HTTPparty দ্বারা সমর্থিত নয়৷

আপনি বাকি ক্লায়েন্ট রত্ন ব্যবহার করতে পারেন:

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 ক্লায়েন্ট উপলব্ধ রয়েছে৷

কিন্তু আপনার কোনটি বেছে নেওয়া উচিত?

এই সিদ্ধান্ত নিতে আপনাকে সাহায্য করার জন্য আমি আপনার জন্য একটি তুলনা টেবিল প্রস্তুত করেছি।

এটি এখানে :

REPO তারা 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
টাইফয়েস/টাইফোউস 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

জনপ্রিয়তার দিকে তাকানো এবং এই রত্নগুলি কতটা ভালভাবে রক্ষণাবেক্ষণ করা হয়েছে তা হল সমস্ত বিকল্পের মূল্যায়ন করার একটি ভাল প্রথম পদক্ষেপ৷

কিন্তু তাদের মধ্যে প্রযুক্তিগত পার্থক্য কি?

এই রত্নগুলির মধ্যে অনেকগুলি হল নেট/http লাইব্রেরির চারপাশে মোড়ানো৷ :

  • এক্সকন
  • httpপার্টি
  • বাকি ক্লায়েন্ট

যদিও ফ্যারাডে একটি অ্যাডাপ্টার রত্ন, এটি বিভিন্ন বাস্তবায়ন ব্যবহার করতে পারে৷

এবং Typhoeus হল C libcurl লাইব্রেরির চারপাশে একটি মোড়ক।

মাল্টি-থ্রেডিংয়ের জন্য টাইফিয়াস

Typhoeus কোনো সমসাময়িক কোড না লিখেই সমকালীন অনুরোধ সমর্থন করে।

আপনি যদি প্রতি সেকেন্ডে আপনার অনুরোধগুলি সর্বাধিক করতে চান তবে এটি টাইফিয়াসকে সেরা পছন্দ করে তোলে৷

মাল্টি-থ্রেডিং সহ টাইফিয়াস ব্যবহার করতে:

require 'typhoeus'

hydra   = Typhoeus::Hydra.hydra
request = Typhoeus::Request.new("https://www.rubyguides.com")

hydra.queue(request)
hydra.queue(request)

hydra.run

অভিযোজনযোগ্যতার জন্য ফ্যারাডে রত্ন

ফ্যারাডে আপনাকে নেট/http থেকে টাইফোয়েস, বা এমনকি বিশ্রাম-ক্লায়েন্ট থেকে একই ইন্টারফেস থেকে সমস্ত কোনো বাস্তবায়ন চয়ন করতে দেয়। .

এটি net/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. ইনপুট ও আউটপুট (IO) রুবিতে:দ্য ডেফিনিটিভ গাইড

  2. রুবি বিকাশকারীদের জন্য সময় জটিলতার নির্দিষ্ট গাইড

  3. রুবি গণনাযোগ্য মডিউলের একটি প্রাথমিক নির্দেশিকা (+ আমার প্রিয় পদ্ধতি)

  4. ম্যাকে অ্যান্ড্রয়েড বার্তাগুলির জন্য চূড়ান্ত গাইড