3.1 สำนักพิมพ์ร่างกาย

ฉันหวังว่าคุณจะไม่ลืมว่านอกเหนือจากคำขอ GETแล้ว ยังมีคำขอPUTและ POST เมื่อคุณต้องการเพิ่มคำขอนั่นคือ เนื้อหาคำขอrequest body

HttpRequestชั้นเรียน มีชั้นในพิเศษสำหรับสิ่งBodyPublisherนี้ แม้ว่าในทางเทคนิคแล้วจะเป็นอินเทอร์เฟซที่มีการนำไปใช้งานหลายอย่าง ซึ่งเราจะกล่าวถึงด้านล่าง

และเราจะเริ่มด้วยวิธีที่ง่ายที่สุด - การไม่มีเนื้อหาคำขอ ใช่มันเกิดขึ้น


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

เรียบง่ายและสวยงาม

3.2 ofString()

ตัวเลือกที่สองที่พบมากที่สุดคือการส่งสตริงเป็นเนื้อหาคำขอ สิ่งนี้ทำได้ง่ายมาก:


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

อย่างไรก็ตาม คุณสามารถตั้งค่าการเข้ารหัสของสตริงที่ส่งได้ ซึ่งจะมีประโยชน์มากหากเซิร์ฟเวอร์ http ที่ส่งคำขอไม่ทำงานบน UTF8


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

3.3 ของไฟล์()

สุดท้าย คุณ อาจต้องการแนบไฟล์กับคำขอ POST นี่เป็นวิธีการอัปโหลดอวตารของคุณไปยังเซิร์ฟเวอร์ ในการทำเช่นนี้คุณต้องเรียกเมธอดofFile()ตำแหน่งที่จะถ่ายโอน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 ของ ByteArray()

สถานการณ์ทั่วไปอื่นคือการส่งชุดของไบต์ไปยังเซิร์ฟเวอร์ ตัวอย่างเช่น คุณทำให้วัตถุบางอย่างเป็นอนุกรมเป็นชุดของไบต์ เข้ารหัสบางอย่าง หรือเพียงแค่ต้องการส่งบัฟเฟอร์ข้อมูลบางอย่าง ซึ่งต้องใช้วิธี.ofByteArray()การ

วิธีนี้ใช้อาร์เรย์ของไบต์เป็นพารามิเตอร์ ตัวอย่าง:


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 ของ InputStream()

สุดท้าย สถานการณ์สุดท้ายที่น่าสนใจไม่น้อยคือการแนบInputStreamคำขอPOST

มีฟังก์ชั่นพิเศษสำหรับสิ่งofInputStream()นี้ และเธอก็ฉลาดมาก ช่วยให้คุณสามารถจัดระเบียบการถ่ายโอนข้อมูลจากสตรีมไปยังสตรีม แนบสตรีมข้อมูลกับคำขอ POSที่ยังไม่เปิด

คุณต้องส่ง ฟังก์ชันไปยังฟังก์ชันofInputStream()ซึ่งจะส่งคืนสตรีมเป็นInputStreamผลลัพธ์

ตัวอย่าง:


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

ฉันไม่ได้สนใจที่จะทำรั้วสวนที่นี่ แต่ฉันคิดว่าคุณเข้าใจหลักการ ทำไมพวกเขาถึงทำอย่างนั้น? คุณสามารถใช้ไฟล์ofByteArray(). แต่ถ้าคุณต้องการส่งข้อมูลแบบอะซิงโครนัสหรือต้องการใช้สถานการณ์ที่ซับซ้อนเป็นพิเศษ คุณสามารถใช้วิธีนี้ได้