ในระยะเริ่มต้นของการเรียนรู้ JavaWeb ทุกคนจะพบกับเมธอด doGet และ doPost ใน HttpServlet ฉันอ่าน "Head First Servlets & JSP" เมื่อสองวันก่อน และเห็นว่ามันพูดถึงความแตกต่างระหว่างรับคำขอและโพสต์คำขอใน Servlets ฉันสรุปได้ดังนี้:
1: ขนาดของข้อมูลที่ร้องขอแตกต่างกัน
เนื่องจากข้อมูลที่ร้องขอโดย get จะถูกผนวกเข้ากับ URL และโดยทั่วไปขนาดข้อมูลของ URL จะต้องไม่เกิน 2K จึงมีการจำกัดขนาดของข้อมูลที่ใช้วิธีการร้องขอ get วิธีการโพสต์คำขอจะใส่ข้อมูลไว้ในเนื้อหาข้อความ ดังนั้นตามทฤษฎีแล้ว ไม่มีการจำกัดจำนวนข้อมูล (แต่ในการใช้งานจริงต้องไม่ใหญ่เกินไป)
2: ความปลอดภัยแตกต่างออกไป
เนื่องจากข้อมูลที่ร้องขอโดย get ถูกผนวกเข้ากับ URL ผู้ใช้ภายนอกจึงสามารถมองเห็นได้ง่ายจากมุมมองนี้ วิธีการโพสต์จะวางคำขอไว้ในเนื้อหาข้อความและจะไม่แสดงใน URL โดยตรง ดังนั้นจากมุมมองนี้ ข้อมูลจะปลอดภัยยิ่งขึ้น
3: การสร้างบุ๊กมาร์ก
รับคำขอสามารถสร้างบุ๊กมาร์กคำขอโพสต์ไม่ได้ ตัวอย่างเช่น สมมติว่าคุณมีเพจที่อนุญาตให้ผู้ใช้สามารถระบุกฎการค้นหาได้ ผู้ใช้อาจกลับมาอีกครั้งในอีกหนึ่งสัปดาห์ต่อมาและต้องการรับข้อมูลต้นฉบับ แต่ในขณะนี้ มีข้อมูลใหม่บนเซิร์ฟเวอร์
4: การใช้วิธีการ
get ใช้เพื่อรับบางสิ่งบางอย่าง เพียงแค่ได้มาง่ายๆ โดยไม่ต้องทำการเปลี่ยนแปลงใดๆ กับเซิร์ฟเวอร์ โพสต์ หมายถึง ผู้ใช้ส่งข้อมูลเพื่อการประมวลผลและสามารถแก้ไขข้อมูลบนเซิร์ฟเวอร์ได้
5: คำขอเป็น idempotent หรือไม่
คำขอรับเป็นแบบ idempotent เพียงได้รับบางสิ่งและไม่ได้แก้ไขเนื้อหาบนเซิร์ฟเวอร์ สามารถทำได้หลายครั้งโดยไม่มีผลข้างเคียงที่ไม่ดี การโพสต์ไม่ใช่ idempotent และข้อมูลที่ส่งในเนื้อหาการโพสต์อาจใช้สำหรับธุรกรรมที่ไม่สามารถย้อนกลับได้ ดังนั้นจากมุมมองนี้ คุณควรใช้ฟังก์ชัน doPost() ด้วยความระมัดระวัง
หากไม่ได้ระบุ method="POST" ในแบบฟอร์ม ระบบจะใช้คำขอ HTTP GET เป็นค่าเริ่มต้น นั่นคือสถานะเริ่มต้นคือการเรียกคำขอรับ
ในระยะเริ่มต้นของการเรียนรู้ JavaWeb ทุกคนจะพบกับเมธอด doGet และ doPost ใน HttpServlet
(1) วิธี doGet: จัดการรับคำขอใน Http เป็นหลัก (2) วิธี doPost: จัดการคำขอโพสต์ใน Http เป็นหลัก
ดังนั้นความแตกต่างระหว่างรับคำขอและโพสต์คำขอคืออะไร?
(1) get มีสตรีมเดียวเท่านั้น พารามิเตอร์จะถูกผนวกเข้ากับ url จำนวนพารามิเตอร์ถูกจำกัดอย่างเคร่งครัดและสามารถเป็นสตริงได้เท่านั้น ตัวอย่างเช่น http://localhost:8888/javaweb/getServlet?name=123
(2) พารามิเตอร์ของโพสต์จะถูกส่งผ่านสตรีมอื่น ไม่ใช่ผ่าน URL ดังนั้นจึงอาจมีขนาดใหญ่มาก และข้อมูลไบนารีก็สามารถส่งผ่านได้ เช่น การอัปโหลดไฟล์
เมื่อใดจึงควรใช้วิธี doGet และ doPost:
1. สำหรับเซิร์ฟเล็ตที่ส่งผ่านแบบฟอร์ม ดูว่าวิธีการของแบบฟอร์มคือรับหรือโพสต์
2. เข้าถึงเซิร์ฟเล็ตผ่านลิงก์ <a href...>, doGet
3. พิมพ์ที่อยู่เซิร์ฟเล็ตโดยตรงในแถบที่อยู่ IE doGet