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()
. แต่ถ้าคุณต้องการส่งข้อมูลแบบอะซิงโครนัสหรือต้องการใช้สถานการณ์ที่ซับซ้อนเป็นพิเศษ คุณสามารถใช้วิธีนี้ได้