4.1 Metode send(), BodyHandlers
Anda telah selesai mempelajari cara membuat permintaan http , sehingga Anda dapat melanjutkan ke hal yang paling penting - mengirim permintaan ini. Dalam kasus paling sederhana, 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? Bagaimana menurutmu? Anda mengirim permintaan, yang berarti Anda harus menerima jawaban - http response
. Dan respons ini dapat memiliki response body
: string, file, array byte, InputStream.
Ya, ya, itu benar. Sama seperti saat membuat permintaan, Anda perlu menentukan jenis response body
responsnya. Totalnya bisa ada 8 buah:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Bergantung pada jenis apa BodyHandlers
yang Anda berikan ke metode send()
, itu akan mengembalikan jenis hasil seperti itu. 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 sebuah file harus dikirimkan kepada Anda sebagai tanggapan, maka BodyHandlers.ofFile()
Anda harus meneruskan nama file lokal ke metode, di mana ia akan disimpan oleh objek HttpClient.
4.2 metode followRedirects()
301
Selain itu, saat mengirim permintaan, Anda dapat menentukan apa yang harus dilakukan HttpClient jika server mengirimkan atau 302
(pengalihan sementara atau permanen) sebagai respons . Bayangkan server telah mengirimkan kode 302
, dan Anda perlu: melacak situasi ini, mendapatkan URL baru dari respons, dan mengirimkan permintaan ke alamat baru.
Saya tidak ingin melakukan ini, terutama mengingat situasi ini biasa terjadi dan telah lama diotomatisasi di semua klien http. Juga di HttpClient ini Anda hanya perlu menentukan mode pengalihan mana yang Anda pilih saat mengirim permintaan.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Hanya ada 3 opsi untuk pengalihan:
- SELALU - selalu;
- TIDAK PERNAH - tidak pernah;
- NORMAL - selalu, kecuali HTTPS -> HTTP.
Seperti yang Anda lihat, tidak banyak pilihan di sini, tetapi selalu lebih baik memiliki kemampuan untuk menyesuaikan daripada tidak memilikinya.
4.4 Metode proxy()
Ada beberapa opsi yang lebih berguna, tetapi tidak sering digunakan. Anda tidak membutuhkannya sampai Anda membutuhkannya :)
Yang pertama adalah proksi. Dalam kehidupan biasa, Anda tidak sering menjumpai mereka, tetapi banyak perusahaan besar memiliki sistem keamanan lalu lintas Internet yang kompleks di dalamnya, dan karenanya berbagai pengaturan proxy.
Yah, tentu saja, perangkat lunak Anda, yang akan bekerja di suatu tempat di perut perusahaan semacam itu, suatu hari nanti akan menghadapi fakta bahwa ia perlu menggunakan proxy. Oleh karena itu, ada baiknya opsi seperti itu juga ada di sini.
Menyiapkan proxy sangat sederhana - contohnya:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
Proxy default telah dipilih di sini, tetapi Anda mungkin ingin menyetelnya sendiri:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Bagaimana tepatnya bekerja dengan proxy, kami tidak akan mempertimbangkannya, karena ini tidak termasuk dalam cakupan kursus ini.
4.5 pengautentikasi()
Dan satu poin penting lagi. Protokol HTTP mendukung otentikasi. Tepat di tingkat protokol.
Sekarang pendekatan ini hampir tidak digunakan, tetapi sekitar 20 tahun yang lalu sudah umum. Permintaan Http terlihat seperti ini:
http://username@example.com/
Atau bahkan seperti ini:
http://username:password@example.com/
Ini bukan surat. Ini persis tautannya. Dan ya, Anda tidak berpikir begitu. Login dan bahkan kata sandi dapat ditentukan langsung dalam permintaan http. Ya, bahkan sekarang Anda bisa. Itu sebabnya saya menulis bahwa biasanya tidak ada yang melakukan ini sekarang. Tapi ada kemungkinan seperti itu.
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! Tahukah Anda mengapa alih-alih “password"
dalam kode yang tertulis "password".toCharArray()
?
Karena parameter konstruktor kedua PasswordAuthentication
bukan String
, tapi CharArray
.
Dan mengapa parameter kedua tidak String
, ya CharArray
?
Karena semua kata sandi tidak boleh disimpan sebagai string utuh untuk tujuan keamanan, bahkan di aplikasi Anda sendiri . Artinya, aplikasi Anda dalam memorinya tidak boleh menyimpan kata sandi sebagai string. Sehingga jika seseorang membuat memori lembab, kata sandi tidak dapat ditarik darinya ...
Tetapi pada saat yang sama, kata sandi dapat dikirimkan melalui protokol HTTP yang tidak aman di separuh dunia :) :) :)
Dengan baik. Dunia ini tidak sempurna.
Anda dapat membaca lebih lanjut tentang topik ini di tautan di bawah ini: