TL; DR
สรุป; ถ้าคุณมีข้อมูลไบนารี (ไม่ใช่ตัวเลข) (หรือน้ำหนักบรรทุกขนาดใหญ่อย่างมีนัยสำคัญ) multipart/form-data
เพื่อส่งใช้ application/x-www-form-urlencoded
มิฉะนั้นการใช้งาน
ประเภท MIME ที่คุณพูดถึงเป็นสองContent-Type
ส่วนหัวสำหรับคำขอ HTTP POST ที่ user-agent (เบราว์เซอร์) ต้องสนับสนุน วัตถุประสงค์ของคำขอทั้งสองประเภทนี้คือการส่งรายการคู่ชื่อ / ค่าไปยังเซิร์ฟเวอร์ วิธีการหนึ่งจะมีประสิทธิภาพมากกว่าวิธีอื่นทั้งนี้ขึ้นอยู่กับชนิดและปริมาณของข้อมูลที่ส่ง เพื่อทำความเข้าใจว่าทำไมคุณต้องดูว่าแต่ละคนทำอะไรภายใต้ผ้าห่ม
สำหรับapplication/x-www-form-urlencoded
เนื้อความของข้อความ HTTP ที่ส่งไปยังเซิร์ฟเวอร์นั้นเป็นหนึ่งในสตริงการสืบค้นขนาดยักษ์หนึ่งคู่ - ชื่อ / ค่าจะถูกคั่นด้วยเครื่องหมายและ ( &
) และชื่อจะถูกแยกออกจากค่าด้วยสัญลักษณ์เท่ากับ ( =
) ตัวอย่างของสิ่งนี้จะเป็น:
MyVariableOne=ValueOne&MyVariableTwo=ValueTwo
ตามข้อกำหนด :
[สงวนและ] อักขระที่ไม่ใช่ตัวอักษรและตัวเลขจะถูกแทนที่ด้วย `% HH 'เครื่องหมายเปอร์เซ็นต์และเลขฐานสิบหกสองหลักแทนรหัส ASCII ของอักขระ
นั่นหมายความว่าสำหรับแต่ละไบต์ที่ไม่ใช่ตัวอักษรและตัวเลขที่มีอยู่ในหนึ่งในค่าของเรามันจะใช้เวลาสามไบต์เพื่อเป็นตัวแทนของมัน สำหรับไฟล์ไบนารี่ขนาดใหญ่การเพิ่มปริมาณข้อมูลสามเท่าจะไม่มีประสิทธิภาพสูง
นั่นคือที่multipart/form-data
มาด้วยวิธีนี้ในการส่งคู่ชื่อ / ค่าแต่ละคู่จะแสดงเป็น "ส่วน" ในข้อความ MIME (ตามที่อธิบายโดยคำตอบอื่น ๆ ) ชิ้นส่วนถูกคั่นด้วยขอบเขตสตริงเฉพาะ (เลือกโดยเฉพาะเพื่อไม่ให้สตริงขอบเขตนี้เกิดขึ้นในส่วนของข้อมูล "ค่า") แต่ละส่วนมีชุดส่วนหัว MIME ของตัวเองContent-Type
และโดยเฉพาะอย่างยิ่งContent-Disposition
ซึ่งสามารถตั้งชื่อ "ชื่อ" ให้แต่ละส่วนได้ ชิ้นส่วนมูลค่าของคู่ชื่อ / ค่าแต่ละคู่คือส่วนของข้อมูลของข้อความ MIME ข้อมูลจำเพาะ MIME ช่วยให้เรามีตัวเลือกมากขึ้นเมื่อแสดงถึงส่วนของข้อมูลที่คุ้มค่า - เราสามารถเลือกการเข้ารหัสข้อมูลไบนารีที่มีประสิทธิภาพยิ่งขึ้นเพื่อประหยัดแบนด์วิดท์ (เช่นฐาน 64 หรือแม้แต่ไบนารีดิบ)
ทำไมไม่ใช้multipart/form-data
ตลอดเวลา? สำหรับค่าตัวอักษรและตัวเลขสั้น ๆ (เช่นเว็บฟอร์มส่วนใหญ่) ค่าใช้จ่ายในการเพิ่มส่วนหัว MIME ทั้งหมดจะมีค่ามากกว่าการออมอย่างมีนัยสำคัญจากการเข้ารหัสไบนารีที่มีประสิทธิภาพมากขึ้น