ความแตกต่างระหว่างส่วนหัว Accept และ Content-Type HTTP


119

ดังนั้นAcceptส่วนหัวจะบอกเซิร์ฟเวอร์ประเภท MIME ของทรัพยากรที่เบราว์เซอร์กำลังมองหา ตัวอย่างเช่นเซิร์ฟเวอร์สามารถส่งข้อความธรรมดา, HTML, JSON เป็นต้น

ตกลงที่เหมาะสม แต่เมื่อฉันดูที่Content-Typeส่วนหัวและดูเหมือนว่าจะทำสิ่งเดียวกัน ตัวอย่างเช่นมันบอกเซิร์ฟเวอร์ว่ามันต้องการข้อความหรือ JSON

ดังนั้นความแตกต่างระหว่างAcceptและContent-Typeส่วนหัว HTTP คืออะไร?

คำตอบ:


155

ตามที่คุณทราบอย่างถูกต้องส่วนหัว Acceptจะถูกใช้โดยไคลเอนต์ HTTP เพื่อบอกเซิร์ฟเวอร์ว่าจะรับเนื้อหาประเภทใด จากนั้นเซิร์ฟเวอร์จะส่งการตอบกลับซึ่งจะรวมส่วนหัวของประเภทเนื้อหาที่บอกลูกค้าว่าประเภทเนื้อหาของเนื้อหาที่ส่งคืนคืออะไร

อย่างไรก็ตามตามที่คุณอาจสังเกตเห็นคำขอ HTTP ยังสามารถมีส่วนหัวของประเภทเนื้อหา ทำไม? ดีคิดเกี่ยวกับการโพสต์หรือPUTร้องขอ ด้วยประเภทคำขอเหล่านั้นลูกค้ากำลังส่งข้อมูลไปยังเซิร์ฟเวอร์เป็นส่วนหนึ่งของคำขอจริง ๆ แล้วส่วนหัว Content-Type จะบอกเซิร์ฟเวอร์ว่าข้อมูลคืออะไรจริง ๆ (และกำหนดวิธีที่เซิร์ฟเวอร์จะแยกวิเคราะห์)

โดยเฉพาะอย่างยิ่งสำหรับคำขอ POST ที่เกิดจากการส่งฟอร์ม HTML ประเภทเนื้อหาของคำขอจะ (ปกติ) เป็นหนึ่งในประเภทเนื้อหาฟอร์มมาตรฐานด้านล่างตามที่ระบุโดยenctypeแอตทริบิวต์ใน<form>แท็ก:

  • application/x-www-form-urlencoded (ค่าเริ่มต้น, เก่ากว่า, ง่ายกว่า, ค่าใช้จ่ายน้อยลงเล็กน้อยสำหรับข้อความ ASCII แบบง่ายจำนวนเล็กน้อย, ไม่รองรับการอัพโหลดไฟล์)
  • multipart/form-data (ใหม่เพิ่มการรองรับการอัปโหลดไฟล์มีประสิทธิภาพมากขึ้นสำหรับข้อมูลไบนารีจำนวนมากหรือข้อความที่ไม่ใช่ ASCII)

22
  • ยอมรับ : เป็นสิ่งที่เบราว์เซอร์สามารถย่อยตัวอย่างเช่นทุกภาษาที่คนเข้าใจ
  • ประเภทเนื้อหา : เป็นรูปแบบข้อมูลจริงที่อยู่ในตัวอย่างเช่นภาษาที่มีคนพูด เนื่องจากคอมพิวเตอร์ไม่สามารถ (ดีตอนนี้พวกเขาสามารถ) รับรู้ประเภทอื่น ๆ เช่นผู้คนสามารถพูดว่า "โอ้เขาเป็นคนเยอรมัน!" หรือ "เธอกำลังพูดภาษาจีน!"

1
ไม่จำเป็นต้องเป็นเบราว์เซอร์ แต่เป็นไคลเอนต์ http ใด ๆ
จิม Aho

20

ยอมรับเป็นเหมือน

นี่คือคำขอของฉันและฉันต้องการ (เพื่อยอมรับ) รูปแบบการตอบกลับนี้

ประเภทเนื้อหาเป็นเหมือน

นี่คือคำขอของฉัน (หรือการตอบสนอง) และนี่ (ประเภทเนื้อหา) เป็นรูปแบบของเนื้อหาที่ฉันส่งในคำขอของฉัน (หรือการตอบสนอง)


ฉันรู้ว่าฉันมาสาย แต่ฉันอยากรู้อยากเห็นจะเกิดอะไรขึ้นถ้ารูปแบบการตอบสนองไม่ได้ส่งในรูปแบบ "ยอมรับ" โดยเซิร์ฟเวอร์
กรีด

1
นั่นจะขึ้นอยู่กับลูกค้าที่จะตัดสินใจ @shriek ฉันเดาว่าไคลเอนต์ http (หรือเบราว์เซอร์) ส่วนใหญ่จะ "ฉลาด" ดูข้อมูลจริงและดูว่ามันคืออะไร บางทีลูกค้ารายหนึ่งอาจยกเลิกการตอบสนองถ้ามันควรจะเป็น JSON แต่การแยกวิเคราะห์ล้มเหลวเพราะดูเหมือนจะเป็นอย่างอื่น
จิม Aho

5

มันคือการสนทนาการตอบสนองคำขอดังนั้นลูกค้า

  • ส่งคำขอ "ประเภทเนื้อหา" และ
  • คาดว่าจะได้รับการตอบกลับประเภทสื่อ "ยอมรับ"

ไม่ถูกต้อง ยอมรับเป็นส่วนหัวคำขอ ดูคำตอบที่ยอมรับได้
darron

2
@darron ไม่คำตอบนี้ถูกต้อง เขาไม่ได้บอกว่ามันไม่ใช่ส่วนหัวของคำขอเขาบอกว่ามันมีจุดประสงค์เพื่อบอกเซิร์ฟเวอร์ว่ามันจะตอบสนองแบบไหน ชนิดที่ซ้ำซ้อนกับคำตอบอื่น ๆ แต่ฉันคิดว่ามันกระชับที่สุด +1
Todd Menier

0

ยอมรับ

ส่วนหัวคำขอ HTTP ยอมรับโฆษณาประเภทเนื้อหาที่แสดงเป็นประเภท MIME ลูกค้าสามารถเข้าใจได้ การใช้การเจรจาต่อรองเนื้อหาจากนั้นเซิร์ฟเวอร์จะเลือกหนึ่งในข้อเสนอใช้มันและแจ้งให้ลูกค้าทราบถึงตัวเลือกของมันด้วยหัวข้อการตอบสนองประเภทเนื้อหา เบราว์เซอร์ตั้งค่าที่เพียงพอสำหรับส่วนหัวนี้ขึ้นอยู่กับบริบทที่มีการร้องขอ: เมื่อดึงสไตล์ชีท CSS ค่าที่แตกต่างจะถูกตั้งค่าสำหรับการร้องขอมากกว่าเมื่อดึงภาพวิดีโอหรือสคริปต์

(ที่มา: developer.mozilla.org )

ชนิดของเนื้อหา

ส่วนหัวของเอนทิตีประเภทเนื้อหาใช้เพื่อระบุประเภทสื่อของทรัพยากร

ในการตอบกลับส่วนหัวของประเภทเนื้อหาจะบอกลูกค้าว่าประเภทเนื้อหาของเนื้อหาที่ส่งคืนจริงคืออะไร เบราว์เซอร์จะทำการแอบอ้าง MIME ในบางกรณีและไม่จำเป็นต้องติดตามค่าของส่วนหัวนี้ เพื่อป้องกันพฤติกรรมนี้ส่วนหัว X-Content-Type-Type สามารถตั้งค่าเป็น nosniff

ในคำขอ (เช่น POST หรือ PUT) ไคลเอ็นต์จะบอกเซิร์ฟเวอร์ว่ามีการส่งข้อมูลประเภทใด

(ที่มา: developer.mozilla.org )

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