Trường nội dung có chiều dài nội dung trong các tiêu đề HTTP là gì?


282

Nó có nghĩa là gì?

  1. Số byte của chuỗi nội dung được mã hóa với mã hóa được chỉ định trong tiêu đề.
  2. Số lượng ký tự của chuỗi nội dung.

Đặc biệt trong trường hợp Content-Type: application/x-www-form-urlencoded.

Câu trả lời:


239

rfc2616

Trường tiêu đề thực thể Độ dài nội dung cho biết kích thước của phần thân thực thể, theo số thập phân của OCTET, được gửi cho người nhận hoặc, trong trường hợp phương thức HEAD, kích thước của phần thân thực thể sẽ được gửi yêu cầu là NHẬN.

Nó không quan trọng kiểu nội dung là gì.

Gia hạn tại bài viết dưới đây .


14
Kết hợp câu trả lời này với câu trả lời từ Tom Cabanski và bạn có tất cả thông tin bạn cần. Trong trường hợp văn bản, bạn có thể đếm số lượng ký tự vì ASCII là 8 bit.
hcpl

9
@hcpl: nhưng văn bản không nhất thiết phải luôn là ASCII, còn ASCII là 7 bit chứ không phải 8.
Lie Ryan

2
Thay thế ASCII bằng bất kỳ mã hóa nào bạn đang sử dụng và tìm kiếm số bit mà mã hóa yêu cầu. Đối với phản hồi 7 vs 8 bit; Ban đầu nó thực sự là 7 bit nên bạn lại đúng. Nhưng ngày nay 8 bit được sử dụng trong hầu hết các trường hợp (nếu không phải tất cả) do cách thức tổ chức bộ nhớ máy tính. chỉnh sửa: Đọc lại câu trả lời của tôi Tôi thấy bạn đang đi đâu. Tôi nên viết lại nhận xét ban đầu của tôi.
hcpl

6
@hcpl: toàn bộ lý do tại sao các vấn đề về byte và ký tự là đáng kể là do mã hóa chiều rộng thay đổi như UTF-8 và UTF-16 trong đó "số bit" không cố định.
StefanKarpinki

2
bạn có thể giả mạo số này? như POST một chuỗi param có độ dài lớn nhưng đặt độ dài nội dung của bạn thành 1?
Shih-Min Lee

260

Đó là số byte dữ liệu trong phần thân của yêu cầu hoặc phản hồi. Phần thân là phần xuất hiện sau dòng trống bên dưới các tiêu đề.


1
Thay vì "yêu cầu hoặc phản hồi", đó không phải là "cơ thể của phản hồi" CHỈ? Yêu cầu không có một dòng trống giữa tiêu đề và dữ liệu.
ajfbiw.s

Tôi có thể thay đổi độ dài nội dung tiêu đề phản hồi HTTP được gửi trong bộ lọc java không
KItis

2
@ ajfbiw.s Hãy xem xét một yêu cầu bài http. "Sự hiện diện của nội dung thư trong yêu cầu được báo hiệu bằng cách bao gồm trường tiêu đề Độ dài nội dung hoặc chuyển mã hóa trong tiêu đề thư của yêu cầu." Từ w3.org/Prot Protocol / rfc2616 / rfc2616-sec4.html # sec4.3
Roy Guanyu

68

Các Content-Lengthtiêu đề là một số biểu thị một độ dài byte chính xác của cơ thể HTTP. Phần thân HTTP bắt đầu ngay sau dòng trống đầu tiên được tìm thấy sau dòng bắt đầu và tiêu đề.

Nói chung, Content-Lengthtiêu đề được sử dụng cho HTTP 1.1 để bên nhận biết khi nào phản hồi hiện tại * kết thúc, do đó kết nối có thể được sử dụng lại cho một yêu cầu khác .

* ... hoặc yêu cầu, trong trường hợp phương thức yêu cầu có phần thân, chẳng hạn như POST, PUT hoặc PATCH

Ngoài ra, Content-Lengthtiêu đề có thể được bỏ qua và một Transfer-Encodingtiêu đề chunk có thể được sử dụng.

Nếu cả hai Content-LengthTransfer-Encodingcác tiêu đề bị thiếu, khi kết thúc phản hồi, kết nối phải được đóng lại.

Tài nguyên sau đây là một hướng dẫn mà tôi thấy rất hữu ích khi tìm hiểu về HTTP:

HTTP Made thực sự dễ dàng .


45

Một octet là 8 bit. Độ dài nội dung là số octet mà phần thân thông điệp đại diện.


37
Octet = AKA Byte?
ViniciusPires

77
@ViniciusPires 'byte' thường được sử dụng để mô tả đơn vị bộ nhớ có địa chỉ nhỏ nhất, không nhất thiết phải là 8 bit trên tất cả các kiến ​​trúc. Đó là lý do tại sao 'octet' được sử dụng để tránh bất kỳ sự mơ hồ nào
PJK

6
@PJK, Không, không chính xác . OCTETở đây có một ý nghĩa rất cụ thể có nghĩa là <bất kỳ chuỗi dữ liệu 8 bit nào>. Xem định nghĩa tại w3.org/Prot Protocol / rfc2616 / rfc2616
sec2.html # sec2.2

28

Từ đây :

Trường tiêu đề thực thể Độ dài nội dung cho biết kích thước của phần thân thực thể, theo số thập phân của OCTET, được gửi cho người nhận hoặc, trong trường hợp phương thức HEAD, kích thước của phần thân thực thể sẽ được gửi yêu cầu là NHẬN.

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

Một ví dụ là

   Content-Length: 3495

Các ứng dụng NÊN sử dụng trường này để chỉ ra độ dài truyền của nội dung thư, trừ khi điều này bị cấm theo các quy tắc trong phần 4.4 .

Bất kỳ Độ dài nội dung nào lớn hơn hoặc bằng 0 là một giá trị hợp lệ. Mục 4.4 mô tả cách xác định độ dài của nội dung thư nếu Độ dài nội dung không được cung cấp.

Lưu ý rằng ý nghĩa của trường này khác biệt đáng kể so với định nghĩa tương ứng trong MIME, trong đó nó là trường tùy chọn được sử dụng trong loại nội dung "thông điệp / nội dung bên ngoài". Trong HTTP, nó NÊN được gửi bất cứ khi nào có thể xác định độ dài của tin nhắn trước khi được chuyển, trừ khi điều này bị cấm theo các quy tắc trong phần 4.4.

Giải thích của tôi là điều này có nghĩa là độ dài "trên dây", tức là độ dài của nội dung * được mã hóa "


7
"Trên dây", độ dài sẽ được thay đổi tùy thuộc vào độ nén, nhưng chính xác là nói độ dài trước khi được nén.
BayssMekanique

Độ dài nội dung sẽ khác nhau trên các loại máy khác nhau như Mac / Linux? HOẶC nó sẽ khác nhau trong khi sử dụng khách hàng khác nhau như curl / postman ...?
Kanagavelu Sugumar

1
Giả sử tất cả những thứ khác vẫn bằng nhau (ví dụ mã hóa, nén, v.v.) thì độ dài nội dung phải độc lập với nền tảng. Đây là một tiêu đề từ máy chủ, vì vậy, giả sử nó không đánh hơi được tác nhân người dùng và hành xử khác đi, khách hàng không nên tạo ra bất kỳ sự khác biệt nào.
Daniel Renshaw

Bản đánh máy ném một lỗi về điều này. Loại 'số' không thể gán cho loại 'chuỗi | chuỗi [] 'vì vậy ví dụ sẽ là"Content-length": "3495"
A. D'Alfonso

8

Từ trang này

Cho đến nay, việc sử dụng POST phổ biến nhất là gửi dữ liệu biểu mẫu HTML tới các tập lệnh CGI. Trong trường hợp này, tiêu đề Content-Type: thường là application / x-www-form-urlencoding và tiêu đề Content-length: cho độ dài của dữ liệu biểu mẫu được mã hóa URL (đây là ghi chú về mã hóa URL). Kịch bản CGI nhận nội dung thư thông qua STDIN và giải mã nó. Đây là một mẫu đệ trình điển hình, sử dụng 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

Theo thông số kỹ thuật :

Trường tiêu đề thực thể Độ dài nội dung cho biết kích thước của phần thân thực thể, theo số thập phân của OCTET, được gửi cho người nhận hoặc, trong trường hợp phương thức HEAD, kích thước của phần thân thực thể sẽ được gửi yêu cầu là NHẬN.

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

Một ví dụ là

Content-Length: 3495

Các ứng dụng NÊN sử dụng trường này để chỉ ra độ dài truyền của nội dung thư, trừ khi điều này bị cấm theo các quy tắc trong phần 4.4.

Bất kỳ Độ dài nội dung nào lớn hơn hoặc bằng 0 là một giá trị hợp lệ. Mục 4.4 mô tả cách xác định độ dài của nội dung thư nếu Độ dài nội dung không được cung cấp.

Lưu ý rằng ý nghĩa của trường này khác biệt đáng kể so với định nghĩa tương ứng trong MIME, trong đó nó là trường tùy chọn được sử dụng trong loại nội dung "thông điệp / nội dung bên ngoài". Trong HTTP, nó NÊN được gửi bất cứ khi nào có thể xác định độ dài của tin nhắn trước khi được chuyển, trừ khi điều này bị cấm theo các quy tắc trong phần 4.4.


2

Trường tiêu đề thực thể Độ dài nội dung cho biết kích thước của phần thân thực thể, theo số thập phân của OCTET, được gửi cho người nhận hoặc, trong trường hợp phương thức HEAD, kích thước của phần thân thực thể sẽ được gửi yêu cầu là NHẬN.

Độ dài nội dung = "Độ dài nội dung" ":" 1 * DIGIT

Một ví dụ là

Độ dài nội dung: 1024

Các ứng dụng NÊN sử dụng trường này để chỉ ra độ dài truyền của nội dung thư.

Trong PHP bạn sẽ sử dụng một cái gì đó như thế này.

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

Trong trường hợp "Loại nội dung: ứng dụng / x-www-form-urlencoding", dữ liệu được mã hóa được gửi đến tác nhân xử lý được chỉ định để bạn có thể đặt độ dài hoặc kích thước của dữ liệu bạn sẽ đăng.


0

Xem xét nếu bạn có các tiêu đề như:

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

Độ dài nội dung là kích thước của nội dung thư được nén , tính bằng "octet" (nghĩa là theo đơn vị 8 bit, là "byte" cho tất cả các máy tính hiện đại).

Các kích thước của nội dung thư thực tế có thể là cái gì khác, có lẽ 150.280 byte.

Số lượng ký tự có thể khác nhau một lần nữa, có thể là 150231 ký tự, vì một số ký tự unicode sử dụng nhiều byte (lưu ý UTF-8 là mã hóa tiêu chuẩn).

Vì vậy, các số khác nhau tùy thuộc vào việc bạn quan tâm đến việc truyền bao nhiêu dữ liệu hay bao nhiêu dữ liệu được lưu giữ hoặc bao nhiêu biểu tượng được nhìn thấy. Tất nhiên, không có gì đảm bảo rằng những tiêu đề này sẽ được cung cấp ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.