โค้ดยิม/หลักสูตรจาวา/โมดูล 3/การเพิ่มเนื้อหาใน HttpRequest

การเพิ่มเนื้อหาใน HttpRequest

ระดับ, บทเรียน
มีอยู่

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

ความคิดเห็น
  • เป็นที่นิยม
  • ใหม่
  • เก่า
คุณต้องลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น
หน้านี้ยังไม่มีความคิดเห็นใด ๆ