3.1 Gövde Yayıncıları

GET isteklerine ek olarak PUT ve POST isteklerinin de olduğunu unutmamışsınızdır , request bodybu arada request yani request body'e de eklemeniz gerekir .

Sınıfın bunun için HttpRequestözel bir iç sınıfı vardır BodyPublisher. Teknik olarak aşağıda tartışacağımız birden çok uygulamaya sahip bir arayüz olmasına rağmen

Ve en basitiyle başlayacağız - bir istek organının olmaması. Evet olur.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.noBody())
   .build();

Basit ve güzel.

3.2 ofString()

İkinci en yaygın seçenek, istek gövdesi olarak bazı dizeleri iletmektir. Bu çok basit bir şekilde yapılır:


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "text/plain;charset=UTF-8")
   .POST(HttpRequest.BodyPublishers.ofString("Hello"))
   .build();

Bu arada, iletilen dizinin kodlamasını ayarlayabilirsiniz. İsteğin gönderildiği http sunucusu UTF8'de çalışmıyorsa çok faydalı olabilir.


HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .POST(HttpRequest.BodyPublishers.ofString("Hello", Charset. US-ASCII)))
   .build();

3.3 ofDosya()

Son olarak, POST isteğine bir dosya eklemek isteyebilirsiniz . Avatarlarınız genellikle sunucuya bu şekilde yüklenir. Bunu yapmak için, yerel dosyayı ofFile()nereye aktaracağınız yöntemini çağırmanız gerekir :Path


Path avatar = Path.of("c://avatar.jpeg");
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "image/jpeg")
   .POST(HttpRequest.BodyPublishers.ofFile(avatar))
   .build();

3.4 ofByteArray()

Başka bir yaygın senaryo, sunucuya bir dizi bayt göndermektir. Örneğin, bir nesneyi bir bayt kümesi olarak seri hale getirdiniz, bir şeyi şifrelediniz veya yalnızca bir miktar veri arabelleği göndermek istiyorsunuz. Bu bir yöntem gerektirir .ofByteArray().

Bu yöntem, bir bayt dizisini parametre olarak alır. Örnek:


byte[] data = "My Secret Message".getBytes();
byte[] dataEncripted = SuperEncriptor.encript(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofByteArray(dataEncripted))
   .build();

3.5 ofInputStream()

Son olarak, ilginç olan son senaryo, bir POST isteğineInputStream iliştirmektir .

Bunun için özel bir işlev var ofInputStream(). Ve o çok akıllı. Akıştan akışa veri aktarımını organize etmenize, henüz açık bile olmayan bir POS isteğine veri akışı eklemenize olanak tanır.

ofInputStream()Sonuç olarak bir akış döndürecek olan işleve bir işlev iletmeniz gerekir InputStream.

Örnek:


byte[] data = "My Secret Message".getBytes();
//wrapping an array of bytes into a stream.
InputStream is = new ByteArrayInputStream(data);
 
HttpRequest request = HttpRequest.newBuilder()
   .uri(new URI("https://codegym.cc"))
   .headers("Content-Type", "application/octet-stream")
   .POST(HttpRequest.BodyPublishers.ofInputStream (() -> is;))
   .build();

Burada bahçeyi çitle çevirme zahmetine girmedim ama prensibi anladığınızı düşünüyorum. Neden bunu yaptılar? neredeyse her zaman kullanabilirsiniz ofByteArray(). Ancak verileri eşzamansız olarak göndermek istiyorsanız veya özellikle karmaşık bir senaryo uygulamanız gerekiyorsa, bu yöntemi kullanabilirsiniz.