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
, और आपको इसकी आवश्यकता है: इस स्थिति को ट्रैक करें, प्रतिक्रिया से एक नया यूआरएल प्राप्त करें, और नए पते पर अनुरोध भेजें।
मैं ऐसा करना पसंद नहीं करूंगा, विशेष रूप से यह देखते हुए कि यह स्थिति सामान्य है और लंबे समय से सभी http ग्राहकों में स्वचालित है। साथ ही इस HttpClient में आपको केवल यह निर्दिष्ट करने की आवश्यकता है कि अनुरोध भेजते समय आप कौन सा रीडायरेक्ट मोड चुनते हैं।
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
रीडायरेक्ट के लिए केवल 3 विकल्प हैं:
- हमेशा - हमेशा;
- कभी नहीं - कभी नहीं;
- सामान्य - हमेशा, 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://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 प्रोटोकॉल पर आधी दुनिया में प्रसारित किया जा सकता है :) :) :)
कुंआ। दुनिया परिपूर्ण नहीं है।
आप नीचे दिए गए लिंक्स पर इस विषय के बारे में अधिक पढ़ सकते हैं: