কম্পিউটার টিউটোরিয়াল

রুবিতে HTTP রিকোয়েস্ট মাস্টারিং: একটি সম্পূর্ণ গাইড

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

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

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

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

শুরু করা যাক!

HTTP রিকোয়েস্ট কীভাবে পাঠাবেন

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

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

POST রিকোয়েস্ট দিয়ে ডেটা সাবমিট করা

একটি GET রিকোয়েস্ট ব্যবহৃত হয় ইনফরমেশন রিকোয়েস্ট করার জন্য।

যেন ইমেজ, css, javascript ডাউনলোড করা…

কিন্তু আপনি যদি ইনফরমেশন সাবমিট করতে চান তবে POST রিকোয়েস্ট ব্যবহার করুন।

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

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

ফাইল আপলোড করার জন্য আপনাকে একটি multipart রিকোয়েস্ট দরকার, যা HTTParty সাপোর্ট করে না।

আপনি rest client gem ব্যবহার করতে পারেন:

 require 'rest-client' RestClient.post '/profile', file: File.new('photo.jpg', 'rb') 

বা Faraday gem:

 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 রিকোয়েস্টের সাথে কাস্টম হেডার পাঠাতে পারেন।

এটি আপনাকে আপনার রিকোয়েস্টের সাথে অতিরিক্ত ডেটা পাঠাতে সাহায্য করে, যেন:

  • Cookies
  • 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 টাইপের রিকোয়েস্টের জন্য খুব ভালো কাজ করে।

সেরা রুবি HTTP ক্লায়েন্ট বেছে নেওয়া

রুবিতে অনেক 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 সি 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 Gem

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.request :json ব্যবহার করুন f.response :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 } 

এটি পোর্ট ৮০৮০-এ একটি সার্ভার তৈরি করে যা যা পায় সেটি প্রিন্ট করে, একটি 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 রিকোয়েস্টের জন্য সবচেয়ে জনপ্রিয় রুবি জেমের একটি ওভারভিউ দেখেছেন। আমার পছন্দ faraday এর ফ্লেক্সিবিলিটির জন্য, কিন্তু আপনার চাহিদা অনুযায়ী অন্য জেম বেছে নেওয়ায় ফ্রি ফিল করুন।

আপনি যদি এই পোস্টটি উপভোগ করেন তবে আপনার বন্ধুদের সাথে শেয়ার করুন যাতে তারা ও উপভোগ করতে পারে 🙂

পড়ার জন্য ধন্যবাদ!


  1. রুবিতে ইনপুট ও আউটপুট (IO) মাস্টার করুন: একটি কম্প্রিহেনসিভ গাইড

  2. টাইম কমপ্লেক্সিটি আয়ত্ত করুন: রুবি ডেভেলপারদের জন্য ব্যাপক গাইড

  3. রুবির Enumerable মডিউল মাস্টার করুন: একটি ব্যবহারিক গাইড + আমার প্রিয় মেথড

  4. ম্যাকে Android Messages ব্যবহার করার পূর্ণাঙ্গ ধাপে ধাপে গাইড