ฟิลด์“ ความยาวเนื้อหา” ในส่วนหัว HTTP คืออะไร


282

มันหมายความว่าอะไร?

  1. จำนวนไบต์ของสตริงเนื้อหาที่เข้ารหัสพร้อมการเข้ารหัสที่ระบุในส่วนหัว
  2. จำนวนตัวอักษรของสตริงเนื้อหา

Content-Type: application/x-www-form-urlencodedโดยเฉพาะอย่างยิ่งในกรณีของ

คำตอบ:


239

RFC2616

ฟิลด์เอนทิตีส่วนหัวความยาวเนื้อหาระบุขนาดของเอนทิตีเนื้อความในจำนวนทศนิยมของ OCTET ที่ส่งไปยังผู้รับหรือในกรณีของวิธี HEAD ขนาดของเอนทิตีที่จะถูกส่งไปมี คำขอเป็น GET

ไม่สำคัญว่าประเภทเนื้อหาจะเป็นอะไร

ส่วนต่อขยายที่โพสต์ด้านล่าง


14
รวมคำตอบนี้กับคำตอบจาก Tom Cabanski และคุณมีข้อมูลทั้งหมดที่คุณต้องการ ในกรณีของข้อความคุณสามารถนับจำนวนตัวอักษรเนื่องจาก ASCII เป็น 8 บิต
hcpl

9
@hcpl: แต่ข้อความไม่จำเป็นเสมอ ASCII เช่นเดียวกับ ASCII คือ 7 บิตไม่ใช่ 8
Lie Ryan

2
แทนที่ ASCII ด้วยการเข้ารหัสที่คุณใช้และค้นหาจำนวนบิตที่การเข้ารหัสต้องการ สำหรับการตอบสนอง 7 vs 8 bit; เดิมทีมันคือ 7 บิตแน่นอนดังนั้นคุณจะถูกอีกครั้ง แต่วันนี้มีการใช้ 8 บิตในกรณีส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) เนื่องจากวิธีการจัดการหน่วยความจำคอมพิวเตอร์ แก้ไข: อ่านคำตอบของฉันอีกครั้งฉันเห็นว่าคุณกำลังจะไปไหน ฉันควรใช้ความคิดเห็นดั้งเดิมของฉันใหม่
hcpl

6
@hcpl: เหตุผลทั้งหมดที่ว่าปัญหาไบต์กับตัวอักขระมีความสำคัญเนื่องจากการเข้ารหัสความกว้างของตัวแปรเช่น UTF-8 และ UTF-16 โดยที่ "จำนวนบิต" ไม่ได้รับการแก้ไข
StefanKarpinski

2
คุณสามารถสร้างหมายเลขนี้ได้หรือไม่ เช่น POST พารามิเตอร์สตริงที่มีความยาวมาก แต่ตั้งค่าความยาวเนื้อหาของคุณเป็น 1 หรือไม่
Shih-Min Lee

260

มันคือจำนวนไบต์ของข้อมูลในเนื้อความของคำขอหรือการตอบกลับ ร่างกายเป็นส่วนที่มาหลังจากบรรทัดว่างด้านล่างส่วนหัว


1
แทนที่จะเป็น "คำขอหรือตอบสนอง" ไม่ใช่ "เนื้อหาของการตอบกลับ" เท่านั้นใช่หรือไม่ คำขอไม่มีบรรทัดว่างระหว่างส่วนหัวและข้อมูล
ajfbiw.s

ฉันจะเปลี่ยนการตอบสนอง HTTP ความยาวของเนื้อหาส่วนหัวยื่นในตัวกรอง Java
KItis

2
@ ajfbiw.s พิจารณาคำขอโพสต์ http "การปรากฏตัวของข้อความในคำขอมีการส่งสัญญาณโดยการรวมของส่วนหัวของเนื้อหาความยาวหรือการถ่ายโอนการเข้ารหัสในส่วนหัวของข้อความคำขอ" จากw3.org/Protocols/rfc2616-recc416.html sec4.3
Roy Guanyu

68

Content-Lengthส่วนหัวเป็นตัวเลขที่แสดงถึงนั้นมีความยาวไบต์ที่แน่นอนของร่างกายของ HTTP เนื้อหา HTTP เริ่มต้นทันทีหลังจากบรรทัดว่างบรรทัดแรกที่พบหลังบรรทัดเริ่มต้นและส่วนหัว

โดยทั่วไปContent-Lengthส่วนหัวจะใช้สำหรับ HTTP 1.1 เพื่อให้ฝ่ายที่รับทราบเมื่อการตอบกลับปัจจุบัน*เสร็จสิ้นดังนั้นการเชื่อมต่อสามารถนำกลับมาใช้สำหรับคำขออื่นได้

* ... หรือคำร้องขอในกรณีของวิธีการร้องขอที่มีเนื้อหาเช่น POST, PUT หรือ PATCH

อีกทางเลือกหนึ่งคือContent-Lengthสามารถละเว้นTransfer-Encodingส่วนหัวและส่วนหัวแบบหนาได้

หากทั้งสองContent-LengthและTransfer-Encodingส่วนหัวหายไปในตอนท้ายของการตอบสนองการเชื่อมต่อจะต้องปิด

ทรัพยากรต่อไปนี้เป็นแนวทางที่ฉันพบว่ามีประโยชน์มากเมื่อเรียนรู้เกี่ยวกับ HTTP:

HTTP Made Easy


45

หนึ่ง octet คือ 8 บิต ความยาวเนื้อหาคือจำนวนของออคเต็ตที่ส่วนเนื้อหาของข้อความ


37
Octet = AKA Byte?
ViniciusPires

77
@ViniciusPires 'byte' ถูกใช้เพื่ออธิบายหน่วยความจำที่อยู่ได้น้อยที่สุดซึ่งไม่จำเป็นต้องเป็น 8 บิตสำหรับสถาปัตยกรรมทั้งหมด นั่นคือเหตุผลที่ 'octet' ถูกใช้เพื่อหลีกเลี่ยงความคลุมเครือใด ๆ
PJK

6
@PJK, Nope ไม่ตรงขวา OCTETที่นี่มีความหมายที่เฉพาะเจาะจงมากซึ่งหมายถึง <ลำดับข้อมูล 8 บิตใด ๆ > ดูคำจำกัดความที่w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2
Pacerier

28

จากที่นี่ :

ฟิลด์เอนทิตีส่วนหัวความยาวเนื้อหาระบุขนาดของเอนทิตีเนื้อความในจำนวนทศนิยมของ OCTET ที่ส่งไปยังผู้รับหรือในกรณีของวิธี HEAD ขนาดของเอนทิตีที่จะถูกส่งไปมี คำขอเป็น GET

   Content-Length    = "Content-Length" ":" 1*DIGIT

ตัวอย่างคือ

   Content-Length: 3495

การประยุกต์ใช้งานควรใช้ข้อมูลนี้เพื่อแสดงให้เห็นการถ่ายโอนความยาวของข้อความที่ร่างกายเว้นแต่นี้เป็นสิ่งต้องห้ามตามกฎในส่วน 4.4

ความยาวเนื้อหาใด ๆ ที่มากกว่าหรือเท่ากับศูนย์จะเป็นค่าที่ถูกต้อง ส่วนที่ 4.4 อธิบายถึงวิธีการกำหนดความยาวของข้อความ - เนื้อหาหากไม่ได้กำหนดความยาวเนื้อหา

โปรดทราบว่าความหมายของฟิลด์นี้แตกต่างอย่างมากจากคำจำกัดความที่เกี่ยวข้องใน MIME ซึ่งเป็นฟิลด์ตัวเลือกที่ใช้ภายในประเภทเนื้อหา "ข้อความ / ภายนอกร่างกาย" ใน HTTP มันควรจะถูกส่งเมื่อใดก็ตามที่สามารถกำหนดความยาวของข้อความก่อนที่จะมีการถ่ายโอนเว้นแต่จะถูกห้ามโดยกฎในส่วนที่ 4.4

การตีความของฉันคือสิ่งนี้หมายความว่าความยาว "บนเส้นลวด" คือความยาวของเนื้อหาที่เข้ารหัส *


7
"บนเส้นลวด" ความยาวจะเปลี่ยนแปลงตามการบีบอัด แต่มันถูกต้องที่จะบอกความยาวก่อนที่จะถูกบีบอัด
BayssMekanique

Content-Length จะแตกต่างกันไปตามประเภทของเครื่องเช่น Mac / Linux หรือไม่? หรือมันจะแตกต่างกันในขณะที่ใช้ไคลเอนต์ที่แตกต่างกันเช่นขด / บุรุษไปรษณีย์ ... ?
Kanagavelu Sugumar

1
สมมติว่าทั้งหมดยังคงเท่ากัน (เช่นการเข้ารหัสการบีบอัด ฯลฯ ) ดังนั้นความยาวของเนื้อหาควรเป็นอิสระจากแพลตฟอร์ม นี่คือส่วนหัวจากเซิร์ฟเวอร์ดังนั้นหากไม่ได้ดมกลิ่นเอเจนต์ผู้ใช้และทำงานต่างกันไคลเอนต์ไม่ควรสร้างความแตกต่าง
Daniel Renshaw

typescript โยนข้อผิดพลาดในเรื่องนี้ Type 'number' ไม่สามารถกำหนดให้พิมพ์ 'string | string [] 'ตัวอย่างเช่น"Content-length": "3495"
A. D'Alfonso

8

จากหน้านี้

การใช้งาน POST ที่พบบ่อยที่สุดคือการส่งข้อมูลฟอร์ม HTML ไปยังสคริปต์ CGI ในกรณีนี้ส่วนหัวของ Content-Type: มักจะเป็นแอปพลิเคชัน / x-www-form-urlencoded และส่วนหัวของ Content-Length: จะให้ความยาวของข้อมูลในแบบฟอร์มที่เข้ารหัส URL (นี่คือหมายเหตุเกี่ยวกับการเข้ารหัส URL) สคริปต์ CGI ได้รับเนื้อหาของข้อความผ่าน STDIN และถอดรหัส นี่คือการส่งแบบฟอร์มทั่วไปโดยใช้ POST:

POST /path/script.cgi HTTP/1.0
From: frog@jmarshall.com
User-Agent: HTTPTool/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32

5

ตามข้อกำหนด :

ฟิลด์เอนทิตีส่วนหัวความยาวเนื้อหาระบุขนาดของเอนทิตีเนื้อความในจำนวนทศนิยมของ OCTET ที่ส่งไปยังผู้รับหรือในกรณีของวิธี HEAD ขนาดของเอนทิตีที่จะถูกส่งไปมี คำขอเป็น GET

Content-Length    = "Content-Length" ":" 1*DIGIT

ตัวอย่างคือ

Content-Length: 3495

แอปพลิเคชันควรใช้ฟิลด์นี้เพื่อระบุความยาวการถ่ายโอนของข้อความ - ข้อความยกเว้นว่าสิ่งนี้ถูกห้ามโดยกฎในหัวข้อ 4.4

ความยาวเนื้อหาใด ๆ ที่มากกว่าหรือเท่ากับศูนย์จะเป็นค่าที่ถูกต้อง ส่วนที่ 4.4 อธิบายถึงวิธีการกำหนดความยาวของข้อความ - เนื้อหาหากไม่ได้กำหนดความยาวเนื้อหา

โปรดทราบว่าความหมายของฟิลด์นี้แตกต่างอย่างมากจากคำจำกัดความที่เกี่ยวข้องใน MIME ซึ่งเป็นฟิลด์ตัวเลือกที่ใช้ภายในประเภทเนื้อหา "ข้อความ / ภายนอกร่างกาย" ใน HTTP มันควรจะถูกส่งเมื่อใดก็ตามที่สามารถกำหนดความยาวของข้อความก่อนที่จะมีการถ่ายโอนเว้นแต่จะถูกห้ามโดยกฎในส่วนที่ 4.4


2

ฟิลด์เอนทิตีส่วนหัวความยาวเนื้อหาระบุขนาดของเอนทิตีเนื้อความในจำนวนทศนิยมของ OCTET ที่ส่งไปยังผู้รับหรือในกรณีของวิธี HEAD ขนาดของเอนทิตีที่จะถูกส่งไปมี คำขอเป็น GET

Content-Length = "ความยาวเนื้อหา" ":" 1 * DIGIT

ตัวอย่างคือ

ความยาวเนื้อหา: 1024

แอปพลิเคชันควรใช้ฟิลด์นี้เพื่อระบุความยาวการถ่ายโอนของส่วนข้อความ

ใน PHP คุณจะใช้สิ่งนี้

header("Content-Length: ".filesize($filename));

ในกรณีของ "Content-Type: application / x-www-form-urlencoded" ข้อมูลที่เข้ารหัสจะถูกส่งไปยังตัวแทนการประมวลผลที่กำหนดไว้เพื่อให้คุณสามารถกำหนดความยาวหรือขนาดของข้อมูลที่คุณจะโพสต์


0

พิจารณาว่าคุณมีส่วนหัวเช่น:

content-encoding: gzip
content-length: 52098
content-type: text/javascript; charset=UTF-8

เนื้อหาที่มีความยาวเป็นขนาดของการบีบอัดเนื้อหาของข้อความใน "octets" (คือในหน่วยของ 8 บิตซึ่งเกิดขึ้นเป็น "ไบต์" สำหรับเครื่องคอมพิวเตอร์ที่ทันสมัยทั้งหมด)

ขนาดของร่างกายข้อความจริงสามารถเป็นอย่างอื่นอาจจะ 150,280 ไบต์

จำนวนอักขระอาจแตกต่างกันอีกครั้งอาจจะเป็น 150231 ตัวอักษรเพราะอักขระยูนิโค้ดบางตัวใช้หลายไบต์ (note UTF-8 เป็นการเข้ารหัสมาตรฐาน)

ดังนั้นตัวเลขที่แตกต่างกันขึ้นอยู่กับว่าคุณใส่ใจว่ามีการส่งข้อมูลมากน้อยเพียงใดหรือเก็บข้อมูลไว้มากแค่ไหน แน่นอนไม่มีการรับประกันว่าส่วนหัวเหล่านี้จะได้รับ ..

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