3.1 Katawan ng mga Publisher

Sana ay hindi mo nakalimutan na bilang karagdagan sa mga kahilingan sa GET , mayroon ding mga kahilingan sa PUT at POST , kapag kailangan mo ring idagdag sa kahilingan request body, iyon ay, ang katawan ng kahilingan.

HttpRequestAng klase ay may espesyal na panloob na klase para dito BodyPublisher. Bagaman ito ay teknikal na isang interface na mayroong maraming mga pagpapatupad, na tatalakayin natin sa ibaba

At magsisimula kami sa pinakasimpleng - ang kawalan ng katawan ng kahilingan. Oo, nangyayari ito.


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

Simple at maganda.

3.2 ngString()

Ang pangalawang pinakakaraniwang opsyon ay ang pagpasa ng ilang string bilang katawan ng kahilingan. Ginagawa ito nang napakasimple:


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

Sa pamamagitan ng paraan, maaari mong itakda ang pag-encode ng ipinadala na string. Maaari itong maging lubhang kapaki-pakinabang kung ang http server kung saan ipinadala ang kahilingan ay hindi gumagana sa UTF8.


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

3.3 ngFile()

Panghuli, maaaring gusto mong mag-attach ng file sa POST request . Ganito karaniwang ina-upload ang iyong mga avatar sa server. Upang gawin ito, kailangan mong tawagan ang pamamaraan ofFile(), kung saan ililipat Pathang lokal na file:


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

Ang isa pang karaniwang senaryo ay ang magpadala ng isang set ng mga byte sa server. Halimbawa, na-serialize mo ang ilang bagay bilang isang hanay ng mga byte, naka-encrypt ng isang bagay, o gusto lang magpadala ng ilang buffer ng data. Nangangailangan ito ng paraan .ofByteArray().

Ang pamamaraang ito ay tumatagal ng isang hanay ng mga byte bilang isang parameter. Halimbawa:


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

Sa wakas, ang pinakahuli ngunit hindi bababa sa kawili-wiling senaryo ay nakakabit InputStreamsa isang kahilingan sa POST .

Mayroong isang espesyal na function para dito ofInputStream(). At napakatalino niya. Pinapayagan ka nitong ayusin ang paglipat ng data mula sa stream patungo sa stream, maglakip ng isang stream ng data sa isang kahilingan sa POS na hindi pa bukas.

Kailangan mong ipasa ang isang function sa function ofInputStream(), na magbabalik ng stream bilang isang resulta InputStream.

Halimbawa:


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

Hindi ako nag-abala na bakod ang hardin dito, ngunit sa palagay ko naiintindihan mo ang prinsipyo. Bakit nila ginawa iyon? Halos palaging magagamit mo ang ofByteArray(). Ngunit kung gusto mong magpadala ng data nang asynchronously o kailangan mong ipatupad ang ilang partikular na kumplikadong senaryo, maaari mong gamitin ang paraang ito.