4.1 পাঠান() পদ্ধতি, বডিহ্যান্ডলার
আপনি কীভাবে একটি http অনুরোধ তৈরি করতে হয় তা শেখা শেষ করেছেন , তাই আপনি সবচেয়ে গুরুত্বপূর্ণ জিনিসটিতে যেতে পারেন - এই অনুরোধটি পাঠানো। সহজ ক্ষেত্রে, এটি করা সহজ:
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() );
System.out.println(response.body() );
আর এগুলো কি BodyHandlers
? আপনি কি মনে করেন? আপনি একটি অনুরোধ পাঠিয়েছেন, যার মানে আপনি একটি উত্তর পাবেন - http response
। এবং এই প্রতিক্রিয়া থাকতে পারে response body
: একটি স্ট্রিং, একটি ফাইল, বাইটের একটি অ্যারে, একটি ইনপুটস্ট্রিম।
হ্যাঁ, হ্যাঁ, এটা ঠিক। ঠিক যেমন একটি অনুরোধ গঠন করার সময়, আপনাকে response body
প্রতিক্রিয়ার ধরন নির্দিষ্ট করতে হবে। মোট 8 টুকরা হতে পারে:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
আপনি কি ধরনের BodyHandlers
পদ্ধতিতে পাস করেছেন তার উপর নির্ভর করে send()
, এটি এই ধরনের ফলাফলের ধরণ ফিরিয়ে দেবে। উদাহরণ:
// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
যদি একটি ফাইল আপনাকে প্রতিক্রিয়া হিসাবে পাঠানো হয়, তাহলে BodyHandlers.ofFile()
আপনাকে স্থানীয় ফাইলের নামটি পদ্ধতিতে পাস করতে হবে, যেখানে এটি HttpClient অবজেক্ট দ্বারা সংরক্ষণ করা হবে।
4.2 ফলোরিডাইরেক্ট() পদ্ধতি
এছাড়াও, একটি অনুরোধ পাঠানোর সময়, সার্ভার প্রতিক্রিয়ায় পাঠালে 301
বা 302
(অস্থায়ী বা স্থায়ী পুনঃনির্দেশ) করলে HttpClient কী করা উচিত তা আপনি উল্লেখ করতে পারেন। কল্পনা করুন যে সার্ভার একটি কোড পাঠিয়েছে 302
, এবং আপনার প্রয়োজন: এই পরিস্থিতি ট্র্যাক করুন, প্রতিক্রিয়া থেকে একটি নতুন URL পান এবং নতুন ঠিকানায় অনুরোধ পাঠান৷
আমি এটি করতে খুব বেশি চাই না, বিশেষ করে বিবেচনা করে যে এই পরিস্থিতিটি সাধারণ এবং দীর্ঘকাল ধরে সমস্ত http ক্লায়েন্টে স্বয়ংক্রিয় হয়েছে। এছাড়াও এই HttpClient-এ আপনাকে অনুরোধ পাঠানোর সময় আপনি কোন রিডাইরেক্ট মোড বেছে নেবেন তা নির্দিষ্ট করতে হবে।
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
একটি পুনঃনির্দেশের জন্য শুধুমাত্র 3টি বিকল্প রয়েছে:
- সর্বদা - সর্বদা;
- NEVER - কখনও না;
- স্বাভাবিক - সবসময়, HTTPS -> HTTP ছাড়া।
আপনি দেখতে পাচ্ছেন, এখানে অনেকগুলি বিকল্প নেই, তবে এটি না থাকার চেয়ে কাস্টমাইজ করার ক্ষমতা থাকা সর্বদা ভাল।
4.4 প্রক্সি() পদ্ধতি
আরও কয়েকটি দরকারী বিকল্প রয়েছে, তবে প্রায়শই ব্যবহৃত হয় না। যতক্ষণ না আপনার তাদের প্রয়োজন হয় ততক্ষণ আপনার ঠিক সেগুলি দরকার নেই :)
প্রথমটি হল প্রক্সি। সাধারণ জীবনে, আপনি প্রায়শই তাদের মুখোমুখি হন না, তবে অনেক বড় কর্পোরেশনের ভিতরে একটি জটিল ইন্টারনেট ট্র্যাফিক নিরাপত্তা ব্যবস্থা রয়েছে এবং তাই বিভিন্ন প্রক্সি সেটিংস।
ঠিক আছে, অবশ্যই, আপনার সফ্টওয়্যার, যা এই জাতীয় কর্পোরেশনের অন্ত্রে কোথাও কাজ করবে, একদিন এই সত্যটির মুখোমুখি হবে যে এটি একটি প্রক্সি ব্যবহার করতে হবে। অতএব, এটি ভাল যে এই ধরনের একটি বিকল্প এখানেও রয়েছে।
একটি প্রক্সি সেট আপ করা খুব সহজ - একটি উদাহরণ:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
ডিফল্ট প্রক্সি এখানে বেছে নেওয়া হয়েছে, কিন্তু আপনি নিজের সেট করতে চাইতে পারেন:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
প্রক্সির সাথে ঠিক কীভাবে কাজ করবেন, আমরা বিবেচনা করব না, যেহেতু এটি এই কোর্সের সুযোগে অন্তর্ভুক্ত নয়।
4.5 প্রমাণীকরণকারী()
এবং আরও একটি গুরুত্বপূর্ণ পয়েন্ট। HTTP প্রোটোকল প্রমাণীকরণ সমর্থন করে। ঠিক প্রোটোকল স্তরে।
এখন এই পদ্ধতিটি প্রায় ব্যবহৃত হয় না, তবে প্রায় 20 বছর আগে এটি সাধারণ ছিল। Http অনুরোধটি এইরকম দেখায়:
http://username@example.com/
বা এমনকি এই মত:
http://username:password@example.com/
এই মেইল না. এই ঠিক লিঙ্ক. এবং হ্যাঁ, আপনি তা ভাবেন নি। লগইন এবং এমনকি পাসওয়ার্ড সরাসরি http অনুরোধে নির্দিষ্ট করা যেতে পারে। হ্যাঁ, এমনকি এখন আপনি পারেন. এই কারণেই আমি লিখি যে এখন সাধারণত কেউ এটি করে না। কিন্তু এমন একটা সম্ভাবনা আছে।
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"password".toCharArray());
}
};
HttpResponse<String> response = HttpClient.newBuilder()
.authenticator(auth).build()
.send(request, BodyHandlers.ofString());
এটা মজার! আপনি কি জানেন কেন “password"
কোডের পরিবর্তে এটি বলে "password".toCharArray()
?
কারণ কনস্ট্রাক্টরের দ্বিতীয় প্যারামিটারটি কিন্তু PasswordAuthentication
নয় ।String
CharArray
এবং কেন দ্বিতীয় প্যারামিটার নয় String
, হাহ CharArray
?
কারণ সমস্ত পাসওয়ার্ড নিরাপত্তার উদ্দেশ্যে সম্পূর্ণ স্ট্রিং হিসাবে সংরক্ষণ করার অনুমতি নেই, এমনকি আপনার নিজের অ্যাপ্লিকেশনেও । অর্থাৎ, আপনার অ্যাপ্লিকেশনটি তার মেমরিতে একটি স্ট্রিং হিসাবে পাসওয়ার্ড সংরক্ষণ করা উচিত নয়। যাতে কেউ স্যাঁতসেঁতে মেমরি তৈরি করে, পাসওয়ার্ডটি তা থেকে বের করা না যায় ...
কিন্তু একই সময়ে, পাসওয়ার্ডটি অর্ধেক বিশ্ব জুড়ে একটি অনিরাপদ HTTP প্রোটোকলের মাধ্যমে প্রেরণ করা যেতে পারে :) :) :)
আমরা হব. পৃথিবী নিখুঁত নয়।
আপনি নীচের লিঙ্কগুলিতে এই বিষয় সম্পর্কে আরও পড়তে পারেন: