4.1 Kaedah hantar(), BodyHandlers
Anda telah selesai mempelajari cara membentuk permintaan http , supaya anda boleh beralih kepada perkara yang paling penting - menghantar permintaan ini. Dalam kes yang paling mudah, ini mudah dilakukan:
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() );
Dan apakah BodyHandlers
ini? Apa pendapat kamu? Anda menghantar permintaan, yang bermaksud anda harus menerima jawapan - http response
. Dan respons ini boleh mempunyai response body
: rentetan, fail, tatasusunan bait, InputStream.
Ya, ya, betul. Sama seperti semasa membuat permintaan, anda perlu menentukan jenis response body
respons. Terdapat 8 keping secara keseluruhan:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Bergantung pada jenis BodyHandlers
yang anda berikan kepada kaedah send()
, ia akan mengembalikan jenis hasil sedemikian. Contoh:
// 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());
Jika fail harus dihantar kepada anda sebagai respons, maka BodyHandlers.ofFile()
anda perlu menghantar nama fail tempatan kepada kaedah, di mana ia akan disimpan oleh objek HttpClient.
4.2 kaedah followRedirects().
301
Selain itu, apabila menghantar permintaan, anda boleh menentukan perkara yang harus dilakukan oleh HttpClient jika pelayan menghantar atau 302
(ubah hala sementara atau kekal) sebagai respons . Bayangkan pelayan telah menghantar kod 302
, dan anda perlu: menjejaki situasi ini, mendapatkan URL baharu daripada respons dan menghantar permintaan ke alamat baharu.
Saya tidak begitu suka melakukan ini, terutamanya memandangkan keadaan ini adalah perkara biasa dan telah lama diautomatikkan dalam semua klien http. Juga dalam HttpClient ini anda hanya perlu menentukan mod ubah hala yang anda pilih semasa menghantar permintaan.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Terdapat hanya 3 pilihan untuk ubah hala:
- SENTIASA - sentiasa;
- TIDAK PERNAH - tidak pernah;
- NORMAL - sentiasa, kecuali HTTPS -> HTTP.
Seperti yang anda lihat, tidak ada banyak pilihan di sini, tetapi lebih baik untuk mempunyai keupayaan untuk menyesuaikan daripada tidak memilikinya.
4.4 Kaedah proksi().
Terdapat beberapa pilihan yang lebih berguna, tetapi tidak sering digunakan. Anda tidak memerlukannya sehingga anda memerlukannya :)
Yang pertama ialah proksi. Dalam kehidupan biasa, anda tidak sering menemui mereka, tetapi banyak syarikat besar mempunyai sistem keselamatan trafik Internet yang kompleks di dalamnya, dan oleh itu pelbagai tetapan proksi.
Sudah tentu, perisian anda, yang akan berfungsi di suatu tempat di dalam perut syarikat sedemikian, suatu hari nanti akan menghadapi hakikat bahawa ia perlu menggunakan proksi. Oleh itu, adalah baik bahawa pilihan sedemikian juga ada di sini.
Menyediakan proksi adalah sangat mudah - contohnya:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Proksi lalai telah dipilih di sini, tetapi anda mungkin mahu menetapkan sendiri:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Bagaimana sebenarnya untuk bekerja dengan proksi, kami tidak akan mempertimbangkan, kerana ini tidak termasuk dalam skop kursus ini.
4.5 pengesah()
Dan satu lagi perkara penting. Protokol HTTP menyokong pengesahan. Betul-betul di peringkat protokol.
Sekarang pendekatan ini hampir tidak digunakan, tetapi kira-kira 20 tahun yang lalu ia adalah perkara biasa. Permintaan Http kelihatan seperti ini:
http://username@example.com/
Atau bahkan seperti ini:
http://username:password@example.com/
Ini bukan mel. Ini betul-betul pautannya. Dan ya, anda tidak fikir begitu. Log masuk dan juga kata laluan boleh ditentukan terus dalam permintaan http. Ya, sekarang pun anda boleh. Itulah sebabnya saya menulis bahawa tiada siapa yang biasanya melakukan ini sekarang. Tetapi ada kemungkinan sedemikian.
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());
Ini menarik! Adakah anda tahu mengapa bukannya “password"
dalam kod yang dikatakan "password".toCharArray()
?
Kerana parameter kedua pembina PasswordAuthentication
bukan String
, tetapi CharArray
.
Dan mengapa parameter kedua tidak String
, ya CharArray
?
Kerana semua kata laluan tidak dibenarkan untuk disimpan sebagai rentetan keseluruhan untuk tujuan keselamatan, walaupun dalam aplikasi anda sendiri . Iaitu, aplikasi anda dalam ingatannya tidak seharusnya menyimpan kata laluan sebagai rentetan. Supaya jika seseorang membuat memori lembap, kata laluan tidak dapat ditarik keluar daripadanya ...
Tetapi pada masa yang sama, kata laluan boleh dihantar melalui protokol HTTP yang tidak selamat merentasi separuh dunia :) :) :)
Baiklah. Dunia tidak sempurna.
Anda boleh membaca lebih lanjut mengenai topik ini di pautan di bawah: