ความแตกต่างของ ContentType และ MimeType คืออะไร


103

เท่าที่ฉันรู้พวกเขาเท่าเทียมกันแน่นอน อย่างไรก็ตามในการเรียกดูเอกสาร django ฉันพบโค้ดนี้:

HttpResponse.__init__(content='', mimetype=None, status=200, content_type='text/html')

ซึ่งทำให้ฉันประหลาดใจที่ทั้งสองเข้าใกล้กัน เอกสารอย่างเป็นทางการสามารถแก้ไขปัญหาได้ในลักษณะที่เป็นไปได้:

content_type เป็นนามแฝงของ mimetype ในอดีตพารามิเตอร์นี้เรียกว่า mimetype เท่านั้น แต่เนื่องจากเป็นค่าที่รวมอยู่ในส่วนหัว HTTP Content-Type จึงสามารถรวมการเข้ารหัสชุดอักขระซึ่งทำให้เป็นมากกว่าข้อกำหนดเฉพาะประเภท MIME หากระบุ mimetype (ไม่ใช่ None) ค่านั้นจะถูกใช้ มิฉะนั้นจะใช้ content_type หากไม่ได้รับการตั้งค่า DEFAULT_CONTENT_TYPE จะถูกใช้

อย่างไรก็ตามฉันไม่พบว่ามันชัดเจนเพียงพอ ทำไมเราใช้การตั้งชื่อ 2 แบบที่แตกต่างกันสำหรับสิ่งที่ (เกือบเหมือนกัน)? "Content-Type" เป็นเพียงชื่อที่ใช้ในคำขอของเบราว์เซอร์และมีการใช้ภายนอกเพียงเล็กน้อยหรือไม่

อะไรคือความแตกต่างที่สำคัญระหว่างแต่ละอันและเมื่อใดที่เหมาะสมที่จะเรียกสิ่งmimetypeที่ตรงข้ามกับcontent-type? ฉันเป็นคนฉลาดและไวยากรณ์นาซีหรือไม่?

คำตอบ:


54

ทำไมเราใช้การตั้งชื่อ 2 แบบที่แตกต่างกันสำหรับสิ่งที่ (เกือบเหมือนกัน)? "Content-Type" เป็นเพียงชื่อที่ใช้ในคำขอของเบราว์เซอร์และมีการใช้ภายนอกเพียงเล็กน้อยหรือไม่

อะไรคือความแตกต่างที่สำคัญระหว่างแต่ละรายการและเมื่อใดที่เหมาะสมที่จะเรียกสิ่งที่เลียนแบบเมื่อเทียบกับประเภทเนื้อหา ฉันเป็นคนฉลาดและไวยากรณ์นาซีหรือไม่?

เหตุผลไม่ใช่แค่ความเข้ากันได้แบบย้อนกลับเท่านั้นและฉันกลัวว่าเอกสาร Django ที่ยอดเยี่ยมมักจะเป็นคลื่นเล็กน้อย MIME (อย่างน้อยก็ควรค่าแก่การอ่านรายการ Wikipedia) มีจุดเริ่มต้นในการขยายอินเทอร์เน็ตเมลและโดยเฉพาะ SMTP จากนั้นการออกแบบส่วนขยายที่ได้รับแรงบันดาลใจจาก MIME และ MIME ได้ค้นพบวิธีการในโปรโตคอลอื่น ๆ มากมาย (เช่น HTTP ที่นี่) และยังคงถูกใช้เมื่อต้องส่งข้อมูลเมตาหรือข้อมูลประเภทใหม่ในโปรโตคอลที่มีอยู่ มี RFC หลายสิบตัวที่กล่าวถึง MIME ที่ใช้เพื่อวัตถุประสงค์มากมายเหลือเฟือ

โดยเฉพาะอย่างยิ่งContent-Type:เป็นหนึ่งในส่วนหัว MIME หลายรายการ "Mimetype" ฟังดูล้าสมัย แต่การอ้างอิงถึง MIME นั้นไม่ได้เป็นเช่นนั้น เรียกส่วนนั้นว่าเข้ากันได้ย้อนหลังถ้าคุณต้องการ

[BTW นี่เป็นปัญหาศัพท์เฉพาะที่ไม่มีส่วนเกี่ยวข้องกับไวยากรณ์ การส่งคำถามการใช้งานทุกคำถามภายใต้ "ไวยากรณ์" ถือเป็นเรื่องน่ายินดีของฉัน Grrrr.]


49

ฉันดู contentType มาโดยตลอดเพื่อเป็นส่วนเหนือของ mimeType ข้อแตกต่างเพียงอย่างเดียวคือการเข้ารหัสชุดอักขระเสริม หาก contentType ไม่มีการเข้ารหัสชุดอักขระที่เป็นทางเลือกการเข้ารหัสจะเหมือนกับ mimeType มิฉะนั้น mimeType เป็นข้อมูลก่อนลำดับการเข้ารหัสชุดอักขระ

เช่น text/html; charset=UTF-8

text/htmlคือ mimeType
;เป็นตัวบ่งชี้พารามิเตอร์เพิ่มเติม
charset=UTF-8คือพารามิเตอร์การเข้ารหัสชุดอักขระ

เช่น application/msword

application/mswordคือ mimeType
ไม่สามารถมีการเข้ารหัสชุดอักขระได้เนื่องจากอธิบายถึงรูปแบบที่ดีที่octet-streamไม่ประกอบด้วยอักขระโดยตรง


1
นี่คือคำตอบที่ถูกต้อง การตั้งค่าการตอบสนอง mime_type (ไม่ใช่ content_type) จะไม่แทนที่ชุดอักขระและจะยังคงเป็น UTF-8
Mikko Ohtamaa

บางครั้งเรียกง่ายๆว่า "ประเภทสื่อ" ประเภท MIME ก็อย่างที่คุณบอกประเภทของสื่อ ในข้อกำหนดบางประการเราจะเห็นคำว่า "ประเภท MIME ที่แยกวิเคราะห์ได้" ซึ่งรวมถึงการใช้คุณสมบัติในContent-Typeส่วนหัว ไวยากรณ์ของContent-Typeสามารถพบได้ที่นี่: tools.ietf.org/html/rfc2045#section-5.1
Josh Habdas

อย่างไรก็ตามในมุมมองของฉัน mime-type เป็นคำที่แคบมากที่ จำกัด ตัวเองไว้ที่อีเมลในขณะที่ content-type เป็นภาษาอังกฤษล้วนสำหรับ "ประเภทของเนื้อหา" ดังนั้นในมุมมองของฉันtext/htmlก็คือประเภทเนื้อหาเช่นกันแม้ว่าผู้คนมักจะเรียกสิ่งนั้นว่า MIME ก็ตาม นอกจากนี้ชื่อที่ใหม่กว่าmedia-typeยังคลุมเครือกว่าเนื่องจากสื่อเป็น 100 สิ่งที่แตกต่างกัน BBC เป็นสื่อ! ดีวีดีเป็นสื่อ! และใครจะเถียงว่ากระแสข้อมูลไม่ใช่ "สื่อ" แต่เป็น "สื่อ"
user2173353

4

หากคุณต้องการทราบรายละเอียดดูตั๋ว3526

อ้าง:

เพิ่ม content_type เป็นนามแฝงสำหรับ mimetype ให้กับตัวสร้าง HttpResponse เป็นชื่อที่ถูกต้องกว่าเล็กน้อย อ้างอิงจากแพทช์จาก Simon Willison เข้ากันได้อย่างเต็มที่


0

ทำไมเราใช้การตั้งชื่อ 2 แบบที่แตกต่างกันสำหรับสิ่งที่ (เกือบเหมือนกัน)?

ความเข้ากันได้ย้อนหลังตามคำพูดของคุณจากเอกสารประกอบ


โอเคฉันเข้าใจเหตุผลเชิงปฏิบัติในการเพิ่มสิ่งนั้นใน django อย่างไรก็ตามหัวใจหลักของคำถามคือทำไมทุกคนจึงใช้สองคำนี้ผสมกันและถ้ามีความแตกต่างกันจริงๆ
Frangossauro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.