আপনি যদি একটি ওয়েবসাইট থেকে ইনফরমেশন পেতে চান, বা ফর্ম সাবমিট করতে চান, ফাইল আপলোড করতে চান, ইত্যাদি।
আপনাকে একটি 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 এর ফ্লেক্সিবিলিটির জন্য, কিন্তু আপনার চাহিদা অনুযায়ী অন্য জেম বেছে নেওয়ায় ফ্রি ফিল করুন।
আপনি যদি এই পোস্টটি উপভোগ করেন তবে আপনার বন্ধুদের সাথে শেয়ার করুন যাতে তারা ও উপভোগ করতে পারে 🙂
পড়ার জন্য ধন্যবাদ!