4.1 Cara ngirim (), BodyHandlers

Sampeyan wis rampung sinau carane nggawe panjalukan http , supaya sampeyan bisa nerusake menyang sing paling penting - ngirim panjalukan iki. Ing kasus sing paling gampang, iki gampang ditindakake:


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() ); 

Lan apa BodyHandlersiki? Piye menurutmu? Sampeyan ngirim panjalukan, tegese sampeyan kudu nampa jawaban - http response. Lan respon iki bisa duwe response body: string, file, Uploaded byte, InputStream.

Ya wis bener. Kaya nalika nggawe panjalukan, sampeyan kudu nemtokake jinis response bodyrespon. Ana total 8 potongan:

  • BodyHandlers.ofByteArray
  • BodyHandlers.ofString
  • BodyHandlers.ofFile
  • BodyHandlers.discarding
  • BodyHandlers.replacing
  • BodyHandlers.ofLines
  • BodyHandlers.fromLineSubscriber

Gumantung ing jinis apa BodyHandlerssing sampeyan tindakake menyang metode kasebut send(), bakal ngasilake jinis asil kasebut. Tuladha:

// 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());

Yen file kudu dikirim menyang sampeyan minangka respon, BodyHandlers.ofFile()sampeyan kudu ngirim jeneng file lokal menyang metode kasebut, sing bakal disimpen dening obyek HttpClient.

4.2 metode followRedirects().

301Uga, nalika ngirim panjalukan, sampeyan bisa nemtokake apa sing kudu ditindakake HttpClient yen server ngirim utawa 302(pangalihan sementara utawa permanen) kanggo nanggepi . Mbayangno sing server wis dikirim kode 302, lan sampeyan kudu: trek kahanan iki, njaluk URL anyar saka respon, lan ngirim panjalukan kanggo alamat anyar.

Aku ora seneng nindakake iki, utamane ngelingi yen kahanan iki umum lan wis suwe wis otomatis ing kabeh klien http. Uga ing HttpClient iki sampeyan mung kudu nemtokake mode pangalihan sing sampeyan pilih nalika ngirim panjalukan.

HttpResponse response = HttpClient.newBuilder()
  .followRedirects( HttpClient.Redirect.ALWAYS )
  .build()
  .send(request, BodyHandlers.ofString());

Mung ana 3 opsi kanggo pangalihan:

  • tansah - tansah;
  • NATE - ora tau;
  • NORMAL - tansah, kajaba HTTPS -> HTTP.

Nalika sampeyan bisa ndeleng, ana ora akeh opsi kene, nanging tansah luwih apik kanggo duwe kemampuan kanggo ngatur saka ora duwe.

4.4 Metode proxy().

Ana sawetara opsi sing luwih migunani, nanging ora asring digunakake. Sampeyan ora butuh dheweke persis nganti sampeyan butuh :)

Sing pisanan yaiku proxy. Ing urip biasa, sampeyan ora kerep nemoni wong-wong mau, nanging akeh perusahaan gedhe duwe sistem keamanan lalu lintas Internet sing kompleks, lan mulane macem-macem setelan proxy.

Mesthi wae, piranti lunak sampeyan, sing bakal digunakake ing endi wae ing njero perusahaan kasebut, bakal nemoni kasunyatan manawa kudu nggunakake proxy. Mulane, luwih becik yen pilihan kasebut uga ana ing kene.

Nyiyapake proxy gampang banget - contone:

HttpResponse<String> response = HttpClient.newBuilder()
  .proxy( ProxySelector.getDefault())
  .build()
  .send(request, BodyHandlers.ofString());

Proksi standar wis dipilih ing kene, nanging sampeyan bisa uga pengin nyetel dhewe:

HttpResponse response = HttpClient.newBuilder()
  .proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
  .build()
  .send(request, BodyHandlers.ofString());

Carane persis bisa karo proxy, kita ora bakal nimbang, amarga iki ora kalebu ing orane katrangan saka kursus iki.

4.5 authenticator()

Lan siji liyane penting. Protokol HTTP ndhukung otentikasi. Tengen ing tingkat protokol.

Saiki pendekatan iki meh ora digunakake, nanging udakara 20 taun kepungkur wis umum. Panjaluk Http katon kaya iki:

http://username@example.com/

Utawa malah kaya iki:

http://username:password@example.com/

Iki dudu surat. Iki persis link. Lan ya, sampeyan ora mikir. Login lan malah sandhi bisa ditemtokake langsung ing panyuwunan http. Ya, malah saiki sampeyan bisa. Mulane aku nulis yen saiki ora ana sing biasane nindakake iki. Nanging ana kamungkinan kuwi.

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());

Iki menarik! Apa sampeyan ngerti kenapa tinimbang “password"ing kode kasebut "password".toCharArray()?

Amarga parameter kapindho konstruktor PasswordAuthentication ora String, nanging CharArray.

Lan kenapa parameter kapindho ora String, huh CharArray?

Amarga kabeh sandhi ora diijini disimpen minangka senar kabeh kanggo tujuan keamanan, sanajan ing aplikasi sampeyan dhewe . Tegese, aplikasi sampeyan ing memori ora kudu nyimpen sandhi minangka senar. Dadi yen ana wong sing nggawe memori lembab, sandhi ora bisa ditarik metu ...

Nanging ing wektu sing padha, sandhi bisa dikirim liwat protokol HTTP sing ora aman ing setengah donya :) :) :)

Inggih. Donya ora sampurna.

Sampeyan bisa maca liyane babagan topik iki ing pranala ing ngisor iki:

otentikasi HTTP

Ngerti Otentikasi HTTP