4.1 send() yöntemi, BodyHandlers

Bir http isteğinin nasıl oluşturulacağını öğrenmeyi bitirdiniz , böylece en önemli şeye, yani bu isteği göndermeye geçebilirsiniz. En basit durumda, bunu yapmak kolaydır:


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

Ve bunlar nedir BodyHandlers? Ne düşünüyorsun? Bir istek gönderdiniz, bu da bir yanıt almanız gerektiği anlamına gelir - http response. Ve bu yanıt şunlara sahip olabilir response body: bir dize, bir dosya, bir bayt dizisi, bir InputStream.

Evet, evet, bu doğru. response bodyTıpkı bir istek oluştururken olduğu gibi, yanıtın türünü belirtmeniz gerekir . Toplamda 8 parça olabilir:

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

BodyHandlersYönteme hangi türü ilettiğinize bağlı olarak send(), böyle bir sonuç türü döndürür. Örnek:

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

Size yanıt olarak bir dosya gönderilmesi gerekiyorsa, BodyHandlers.ofFile()yerel dosyanın adını HttpClient nesnesi tarafından kaydedileceği yönteme iletmeniz gerekir.

4.2 FollowRedirects() yöntemi

Ayrıca, bir istek gönderirken, HttpClient'in yanıt olarak göndermesi 301veya 302(geçici veya kalıcı yönlendirme) yapması durumunda ne yapması gerektiğini belirtebilirsiniz. Sunucunun bir kod gönderdiğini 302ve sizin: bu durumu izlemeniz, yanıttan yeni bir URL almanız ve isteği yeni adrese göndermeniz gerektiğini düşünün.

Özellikle bu durumun yaygın olduğunu ve tüm http istemcilerinde uzun süredir otomatikleştirildiğini düşünürsek, bunu yapmayı pek istemem. Ayrıca bu HttpClient'te, isteği gönderirken hangi yönlendirme modunu seçtiğinizi belirtmeniz yeterlidir.

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

Yönlendirme için yalnızca 3 seçenek vardır:

  • HER ZAMAN - her zaman;
  • ASLA - asla;
  • NORMAL - her zaman, HTTPS -> HTTP hariç.

Gördüğünüz gibi, burada çok fazla seçenek yok, ancak özelleştirme yeteneğine sahip olmak, sahip olmamaktan her zaman daha iyidir.

4.4 proxy() yöntemi

Birkaç tane daha kullanışlı, ancak sık kullanılmayan seçenek var. Onlara tam olarak ihtiyacınız olana kadar onlara ihtiyacınız yok :)

İlki proxy'dir. Sıradan hayatta bunlarla pek karşılaşmazsınız ama birçok büyük şirketin kendi içinde karmaşık bir internet trafiği güvenlik sistemi ve dolayısıyla çeşitli proxy ayarları vardır.

Eh, elbette, böyle bir şirketin bağırsaklarında bir yerde çalışacak olan yazılımınız, bir gün bir proxy kullanması gerekeceği gerçeğiyle karşılaşacaktır. Bu nedenle böyle bir seçeneğin burada da olması iyi.

Proxy ayarlamak çok basittir - bir örnek:

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

Burada varsayılan proxy seçilmiştir, ancak siz kendinizinkini ayarlamak isteyebilirsiniz:

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

Bir proxy ile tam olarak nasıl çalışılacağını ele almayacağız çünkü bu, bu kursun kapsamına dahil değildir.

4.5 kimlik doğrulayıcı()

Ve bir önemli nokta daha. HTTP protokolü kimlik doğrulamayı destekler. Tam protokol düzeyinde.

Şimdi bu yaklaşım neredeyse kullanılmıyor, ancak yaklaşık 20 yıl önce yaygındı. Http isteği şuna benziyordu:

http://username@example.com/

Hatta şöyle:

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

Bu posta değil. Bu tam olarak bağlantıdır. Ve evet, öyle düşünmedin. Oturum açma ve hatta parola doğrudan http isteğinde belirtilebilir. Evet, şimdi bile yapabilirsin. Bu yüzden şimdi kimsenin bunu genellikle yapmadığını yazıyorum. Ama böyle bir ihtimal var.

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

Bu ilginç! “password"Yazdığı kod yerine neden biliyor musunuz "password".toCharArray()?

Çünkü yapıcının ikinci parametresi PasswordAuthentication değil String, fakat CharArray.

Ve neden ikinci parametre değil String, ha CharArray?

Çünkü tüm şifrelerin kendi uygulamanızda bile güvenlik amacıyla bütün bir dizi olarak saklanmasına izin verilmez . Yani uygulamanız kendi hafızasında şifreyi string olarak saklamamalıdır. Böylece birisi nemli bellek yaparsa, şifre ondan çıkarılamazdı ...

Ama aynı zamanda, şifre güvenli olmayan bir HTTP protokolü üzerinden dünyanın yarısına iletilebilir :) :) :)

Kuyu. Dünya mükemmel değil.

Bu konu hakkında daha fazla bilgiyi aşağıdaki bağlantılardan okuyabilirsiniz:

HTTP kimlik doğrulaması

HTTP Kimlik Doğrulamasını Anlamak