CodeGym /Java Course /मॉड्यूल 3 /HttpClient सह विनंती करत आहे

HttpClient सह विनंती करत आहे

मॉड्यूल 3
पातळी 10 , धडा 3
उपलब्ध

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 followRedirects() पद्धत

तसेच, विनंती पाठवताना, सर्व्हरने प्रतिसादात 301किंवा 302(तात्पुरते किंवा कायमचे पुनर्निर्देशन) पाठवल्यास HttpClient काय करावे हे तुम्ही निर्दिष्ट करू शकता. कल्पना करा की सर्व्हरने एक कोड पाठवला आहे 302, आणि तुम्हाला हे करणे आवश्यक आहे: या परिस्थितीचा मागोवा घेणे, प्रतिसादातून नवीन URL मिळवणे आणि नवीन पत्त्यावर विनंती पाठवणे.

मला हे करायला फारसे आवडणार नाही, विशेषत: ही परिस्थिती सामान्य आहे आणि सर्व 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());

प्रॉक्सीसह नेमके कसे कार्य करावे, आम्ही विचार करणार नाही, कारण हे या अभ्यासक्रमाच्या व्याप्तीमध्ये समाविष्ट नाही.

४.५ प्रमाणक()

आणि आणखी एक महत्त्वाचा मुद्दा. 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 प्रोटोकॉलवर प्रसारित केला जाऊ शकतो :) :) :)

विहीर. जग परिपूर्ण नाही.

तुम्ही खालील लिंक्सवर या विषयाबद्दल अधिक वाचू शकता:

HTTP प्रमाणीकरण

HTTP प्रमाणीकरण समजून घेणे

टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION