Tiêu đề Http là gì? Lý thuyết chung. Tạo yêu cầu HTTP

Chúng tôi trình bày cho bạn chú ý mô tả về các khía cạnh chính của giao thức HTTP - giao thức mạng, từ đầu những năm 90 cho đến ngày nay, cho phép trình duyệt của bạn tải các trang web. Bài viết này được viết dành cho những người mới bắt đầu làm việc với mạng máy tính và phát triển các ứng dụng mạng, và những người vẫn cảm thấy khó khăn khi tự mình đọc các thông số kỹ thuật chính thức.

HTTP- một giao thức truyền dữ liệu được sử dụng rộng rãi, ban đầu được thiết kế để truyền các tài liệu siêu văn bản (nghĩa là các tài liệu có thể chứa các liên kết cho phép điều hướng đến các tài liệu khác).

HTTP viết tắt là viết tắt của Giao thức truyền siêu văn bản, "giao thức truyền siêu văn bản". Theo đặc tả OSI, HTTP là giao thức lớp ứng dụng (trên, lớp 7). Hiện tại đang bật khoảnh khắc này phiên bản giao thức HTTP 1.1 được mô tả trong đặc tả RFC 2616.

Giao thức HTTP liên quan đến việc sử dụng cấu trúc truyền dữ liệu máy khách-máy chủ. Ứng dụng khách tạo một yêu cầu và gửi nó đến máy chủ, sau đó ứng dụng máy chủ phần mềm xử lý yêu cầu này, tạo phản hồi và gửi lại cho khách hàng. Sau đó ứng dụng khách có thể tiếp tục gửi các yêu cầu khác và sẽ được xử lý theo cách tương tự.

Một nhiệm vụ thường được giải quyết bằng giao thức HTTP là trao đổi dữ liệu giữa ứng dụng người dùng truy cập tài nguyên web (thường là trình duyệt web) và máy chủ web. Hiện tại, World Wide Web hoạt động là nhờ giao thức HTTP.

HTTP cũng thường được sử dụng làm giao thức truyền thông tin cho các giao thức khác. cấp độ ứng dụng chẳng hạn như SOAP, XML-RPC và WebDAV. Trong trường hợp này, giao thức HTTP được cho là được sử dụng như một “phương tiện vận chuyển”.

API của nhiều sản phẩm phần mềm cũng ngụ ý việc sử dụng HTTP để truyền dữ liệu - bản thân dữ liệu có thể ở bất kỳ định dạng nào, ví dụ: XML hoặc JSON.

Thông thường, việc truyền dữ liệu HTTP được thực hiện qua kết nối TCP/IP. Trong trường hợp này, phần mềm máy chủ thường sử dụng cổng TCP 80 (và nếu cổng này không được chỉ định rõ ràng thì phần mềm máy khách thường sử dụng cổng 80 theo mặc định để mở kết nối HTTP), mặc dù nó có thể sử dụng bất kỳ cổng nào khác.

Làm cách nào để gửi yêu cầu HTTP?

Cách dễ nhất để hiểu giao thức HTTP là cố gắng truy cập một số tài nguyên web theo cách thủ công. Hãy tưởng tượng bạn là một trình duyệt và bạn có một người dùng thực sự muốn đọc các bài viết của Anatoly Alizar.

Giả sử rằng anh ta đã bước vào thanh địa chỉ tiếp theo:

Http://alizar.habrahabr.ru/

Theo đó, với tư cách là một trình duyệt web, bây giờ bạn cần kết nối với máy chủ web tại alizar.habrahabr.ru.

Đối với điều này, bạn có thể sử dụng bất kỳ tiện ích phù hợp dòng lệnh. Ví dụ: telnet:

Telnet alizar.habrahabr.ru 80

Hãy để tôi làm rõ ngay rằng nếu bạn đột ngột thay đổi ý định, hãy nhấn Ctrl + “]” rồi nhập - thao tác này sẽ cho phép bạn đóng kết nối HTTP. Ngoài telnet, bạn có thể thử nc (hoặc ncat) - tùy theo sở thích của bạn.

Sau khi kết nối với máy chủ, bạn cần gửi yêu cầu HTTP. Nhân tiện, điều này rất dễ dàng - các yêu cầu HTTP có thể chỉ bao gồm hai dòng.

Để tạo yêu cầu HTTP, bạn cần soạn dòng bắt đầu và cũng đặt ít nhất một tiêu đề - đây là tiêu đề Máy chủ, bắt buộc và phải có trong mọi yêu cầu. Thực tế là việc chuyển đổi tên miền thành địa chỉ IP được thực hiện ở phía máy khách và theo đó, khi bạn mở kết nối TCP, thì máy chủ từ xa không có bất kỳ thông tin nào về địa chỉ chính xác nào được sử dụng để kết nối: ví dụ: đó có thể là địa chỉ alizar.habrahabr.ru, habrahabr.ru hoặc m.habrahabr.ru - và trong tất cả các trường hợp này, câu trả lời có thể khác . Tuy nhiên, trên thực tế Kết nối mạng trong mọi trường hợp, nó mở bằng nút 212.24.43.44 và ngay cả khi ban đầu khi mở kết nối, địa chỉ IP này không được chỉ định mà là một số Tên miền, thì máy chủ sẽ không được thông báo về điều này theo bất kỳ cách nào - và đó là lý do tại sao địa chỉ này phải được chuyển trong tiêu đề Máy chủ.

Dòng yêu cầu bắt đầu (ban đầu) cho HTTP 1.1 được soạn theo sơ đồ sau:

Ví dụ: (dòng bắt đầu như vậy có thể cho biết trang chính của trang web đang được yêu cầu):

Và tất nhiên, đừng quên rằng mọi công nghệ đều trở nên đơn giản và rõ ràng hơn nhiều khi bạn thực sự bắt đầu sử dụng nó.

Chúc may mắn và học tập hiệu quả!

Thẻ: Thêm thẻ

HTTP (Giao thức truyền siêu văn bản) được phát triển làm cơ sở toàn thế giới Web.

Giao thức HTTP hoạt động như sau: chương trình máy khách thiết lập kết nối TCP với máy chủ ( Phòng tiêu chuẩn port-80) và đưa ra yêu cầu HTTP tới nó. Máy chủ xử lý yêu cầu này và đưa ra phản hồi HTTP cho máy khách.

Cấu trúc yêu cầu HTTP

Yêu cầu HTTP bao gồm tiêu đề yêu cầu và nội dung yêu cầu, được phân tách bằng một dòng trống. Nội dung yêu cầu có thể bị thiếu.

Tiêu đề yêu cầu bao gồm dòng chính (đầu tiên) của yêu cầu và các dòng tiếp theo làm rõ yêu cầu trong dòng chính. Các dòng tiếp theo cũng có thể bị thiếu.

Truy vấn dòng chính bao gồm ba phần, cách nhau bằng dấu cách:

Phương pháp(nói cách khác là lệnh HTTP):

LẤY- yêu cầu tài liệu. Phương pháp được sử dụng phổ biến nhất; trong HTTP/0.9, họ nói, anh ấy là người duy nhất.

CÁI ĐẦU- yêu cầu tiêu đề tài liệu. Nó khác với GET ở chỗ chỉ trả về tiêu đề yêu cầu có thông tin về tài liệu. Bản thân tài liệu không được ban hành.

BƯU KIỆN- phương pháp này được sử dụng để truyền dữ liệu sang tập lệnh CGI. Bản thân dữ liệu xuất hiện trong các dòng tiếp theo của yêu cầu dưới dạng tham số.

ĐẶT- đặt tài liệu trên máy chủ. Theo tôi biết thì nó hiếm khi được sử dụng. Một yêu cầu với phương pháp này có phần thân trong đó tài liệu được truyền đi.

Nguồn- đây là cách để tập tin cụ thể trên máy chủ mà máy khách muốn nhận (hoặc đặt - đối với phương thức PUT). Nếu tài nguyên chỉ đơn giản là một số tệp cần đọc thì máy chủ phải trả lại nó trong phần nội dung phản hồi cho yêu cầu này. Nếu đây là đường dẫn đến tập lệnh CGI thì máy chủ sẽ chạy tập lệnh và trả về kết quả thực thi tập lệnh đó. Nhân tiện, nhờ sự thống nhất các tài nguyên này, khách hàng thực tế không quan tâm đến những gì anh ta đại diện trên máy chủ.

Phiên bản giao thức-version của giao thức HTTP mà chương trình máy khách hoạt động.

Vì vậy, một yêu cầu HTTP đơn giản có thể trông như thế này:

Điều này yêu cầu tệp gốc từ thư mục gốc của máy chủ web.

Dòng sau dòng chính yêu cầu có định dạng sau:

Giá trị tham số.

Đây là cách các tham số yêu cầu được thiết lập. Đây là tùy chọn; tất cả các dòng sau dòng truy vấn chính có thể bị thiếu; trong trường hợp này, máy chủ chấp nhận giá trị của chúng theo mặc định hoặc dựa trên kết quả của yêu cầu trước đó (khi làm việc ở chế độ Keep-Alive).

Tôi sẽ liệt kê một số tham số yêu cầu HTTP được sử dụng phổ biến nhất:

Sự liên quan(kết nối) - có thể lấy các giá trị Keep-Alive và đóng. Keep-Alive có nghĩa là sau khi phát hành tài liệu này, kết nối đến máy chủ không bị ngắt và có thể đưa ra nhiều yêu cầu hơn. Hầu hết các trình duyệt hoạt động ở chế độ Keep-Alive, vì nó cho phép bạn "tải xuống" trang html và hình ảnh cho trang đó trong một kết nối với máy chủ. Sau khi được đặt, chế độ Keep-Alive sẽ được duy trì cho đến khi xảy ra lỗi đầu tiên hoặc cho đến khi yêu cầu Kết nối: đóng tiếp theo được chỉ định rõ ràng.
close ("đóng") - kết nối bị đóng sau khi phản hồi yêu cầu này.

Đại lý người dùng- giá trị là “mã” của trình duyệt, ví dụ:

Mozilla/4.0 (tương thích; MSIE 5.0; Windows 95; DigExt)

Chấp nhận- danh sách các loại nội dung được trình duyệt hỗ trợ theo thứ tự ưu tiên của chúng đối với một trình duyệt nhất định, ví dụ như đối với IE5 của tôi:

Chấp nhận: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*

Điều này rõ ràng là cần thiết trong trường hợp máy chủ có thể xuất ra cùng một tài liệu ở các định dạng khác nhau.

Giá trị của tham số này chủ yếu được sử dụng bởi các tập lệnh CGI để tạo phản hồi phù hợp với trình duyệt nhất định.

Người giới thiệu- URL mà bạn đã truy cập vào tài nguyên này.

Chủ nhà- tên của máy chủ mà tài nguyên được yêu cầu. Hữu ích nếu máy chủ có nhiều máy chủ ảo có cùng địa chỉ IP. Trong trường hợp này tên máy chủ ảođược xác định bởi trường này.

Ngôn ngữ chấp nhận- ngôn ngữ được hỗ trợ. Điều quan trọng đối với một máy chủ có thể phục vụ cùng một tài liệu ở các phiên bản ngôn ngữ khác nhau.

Định dạng phản hồi HTTP

Định dạng phản hồi rất giống với định dạng yêu cầu: nó cũng có phần đầu và phần thân được phân tách bằng một dòng trống.

Tiêu đề cũng bao gồm một dòng chính và các dòng tham số, nhưng định dạng của dòng chính khác với định dạng của tiêu đề yêu cầu.

Chuỗi truy vấn chính bao gồm 3 trường cách nhau bằng dấu cách:

Phiên bản giao thức- tương tự với tham số yêu cầu tương ứng.

Mã lỗi- mã chỉ định “thành công” của yêu cầu. Mã 200 có nghĩa là “mọi thứ đều ổn” (OK).

Mô tả bằng lời về lỗi- “giải mã” mã trước đó. Ví dụ: với 200 thì được, với 500 - Máy chủ nội bộ Lỗi.

Các tham số phản hồi http phổ biến nhất:

Sự liên quan- tương tự với tham số yêu cầu tương ứng.
Nếu máy chủ không hỗ trợ Keep-Alive (có một số), thì giá trị Kết nối trong phản hồi luôn đóng.

Vì vậy, theo tôi, chiến thuật trình duyệt đúng đắn là như sau:
1. phát hành Connection: Keep-Alive trong yêu cầu;
2. Trạng thái kết nối có thể được đánh giá bằng trường Kết nối trong phản hồi.

Loại nội dung(“loại nội dung”) - chứa chỉ định loại nội dung của phản hồi.

Tùy thuộc vào giá trị Content-Type, trình duyệt diễn giải phản hồi dưới dạng trang HTML, hình ảnh gif hoặc jpeg, dưới dạng tệp sẽ được lưu vào đĩa hoặc bất kỳ thứ gì và thực hiện hành động thích hợp. Giá trị Content-Type cho trình duyệt giống với giá trị phần mở rộng tệp cho Windows.

Một số loại nội dung:

text/html - văn bản ở định dạng HTML (trang web);
text/plain - văn bản thuần túy (tương tự Notepad);
image/jpeg - ảnh ở định dạng JPEG;
hình ảnh/gif - giống nhau, ở định dạng GIF;
ứng dụng/octet-stream - một luồng "octet" (tức là chỉ byte) để ghi vào đĩa.

Thực tế có nhiều loại nội dung hơn.

Thời lượng nội dung("độ dài nội dung") - độ dài của nội dung phản hồi tính bằng byte.

Sửa đổi lần cuối("Đã sửa đổi lần trước") - ngày thay đổi cuối cùng tài liệu.

Chúng tôi trình bày cho bạn mô tả về các khía cạnh chính của giao thức HTTP - một giao thức mạng, từ đầu những năm 90 cho đến ngày nay, cho phép trình duyệt của bạn tải các trang web. Bài viết này được viết dành cho những người mới bắt đầu làm việc với mạng máy tính và phát triển các ứng dụng mạng và những người vẫn cảm thấy khó khăn khi tự mình đọc các thông số kỹ thuật chính thức.

HTTP- một giao thức truyền dữ liệu được sử dụng rộng rãi, ban đầu được thiết kế để truyền các tài liệu siêu văn bản (nghĩa là các tài liệu có thể chứa các liên kết cho phép điều hướng đến các tài liệu khác).

HTTP viết tắt là viết tắt của Giao thức truyền siêu văn bản, "giao thức truyền siêu văn bản". Theo đặc tả OSI, HTTP là giao thức lớp ứng dụng (trên, lớp 7). Phiên bản hiện tại của giao thức, HTTP 1.1, được mô tả trong đặc tả RFC 2616.

Giao thức HTTP liên quan đến việc sử dụng cấu trúc truyền dữ liệu máy khách-máy chủ. Ứng dụng khách tạo yêu cầu và gửi nó đến máy chủ, sau đó phần mềm máy chủ xử lý yêu cầu, tạo phản hồi và gửi lại cho khách hàng. Sau đó, ứng dụng khách có thể tiếp tục gửi các yêu cầu khác và sẽ được xử lý theo cách tương tự.

Một nhiệm vụ thường được giải quyết bằng giao thức HTTP là trao đổi dữ liệu giữa ứng dụng người dùng truy cập tài nguyên web (thường là trình duyệt web) và máy chủ web. Hiện tại, World Wide Web hoạt động là nhờ giao thức HTTP.

HTTP cũng thường được sử dụng làm giao thức truyền tải cho các giao thức lớp ứng dụng khác như SOAP, XML-RPC và WebDAV. Trong trường hợp này, giao thức HTTP được cho là được sử dụng như một “phương tiện vận chuyển”.

API của nhiều sản phẩm phần mềm cũng ngụ ý việc sử dụng HTTP để truyền dữ liệu - bản thân dữ liệu có thể ở bất kỳ định dạng nào, chẳng hạn như XML hoặc JSON.

Thông thường, việc truyền dữ liệu HTTP được thực hiện qua kết nối TCP/IP. Trong trường hợp này, phần mềm máy chủ thường sử dụng cổng TCP 80 (và nếu cổng này không được chỉ định rõ ràng thì phần mềm máy khách thường sử dụng cổng 80 theo mặc định để mở kết nối HTTP), mặc dù nó có thể sử dụng bất kỳ cổng nào khác.

Làm cách nào để gửi yêu cầu HTTP?

Cách dễ nhất để hiểu giao thức HTTP là cố gắng truy cập một số tài nguyên web theo cách thủ công. Hãy tưởng tượng bạn là một trình duyệt và bạn có một người dùng thực sự muốn đọc các bài viết của Anatoly Alizar.

Giả sử anh ấy đã nhập thông tin sau vào thanh địa chỉ:

Http://alizar.site/

Theo đó, với tư cách là một trình duyệt web, bây giờ bạn cần kết nối với máy chủ web tại alizar.site.

Để thực hiện việc này, bạn có thể sử dụng bất kỳ tiện ích dòng lệnh phù hợp nào. Ví dụ: telnet:

Telnet alizar.site 80

Hãy để tôi làm rõ ngay rằng nếu bạn đột ngột thay đổi ý định, hãy nhấn Ctrl + “]” rồi nhập - thao tác này sẽ cho phép bạn đóng kết nối HTTP. Ngoài telnet, bạn có thể thử nc (hoặc ncat) - tùy theo sở thích của bạn.

Sau khi kết nối với máy chủ, bạn cần gửi yêu cầu HTTP. Nhân tiện, điều này rất dễ dàng - các yêu cầu HTTP có thể chỉ bao gồm hai dòng.

Để tạo yêu cầu HTTP, bạn cần soạn dòng bắt đầu và cũng đặt ít nhất một tiêu đề - đây là tiêu đề Máy chủ, bắt buộc và phải có trong mọi yêu cầu. Thực tế là việc chuyển đổi tên miền thành địa chỉ IP được thực hiện ở phía máy khách và theo đó, khi bạn mở kết nối TCP, máy chủ từ xa không có bất kỳ thông tin nào về địa chỉ nào được sử dụng cho kết nối: ví dụ: nó có thể là địa chỉ alizar..ru hoặc m.. Tuy nhiên, trên thực tế, kết nối mạng trong mọi trường hợp đều mở bằng nút 212.24.43.44 và ngay cả khi ban đầu khi mở kết nối, đó không phải là địa chỉ IP này, mà là một số tên miền đã được chỉ định thì máy chủ sẽ báo cáo rằng điều này không được thông báo theo bất kỳ cách nào - và đó là lý do tại sao địa chỉ này phải được chuyển trong tiêu đề Máy chủ.

Dòng yêu cầu bắt đầu (ban đầu) cho HTTP 1.1 được soạn theo sơ đồ sau:

Ví dụ: (dòng bắt đầu như vậy có thể cho biết trang chính của trang web đang được yêu cầu):

Và tất nhiên, đừng quên rằng mọi công nghệ đều trở nên đơn giản và rõ ràng hơn nhiều khi bạn thực sự bắt đầu sử dụng nó.

Chúc may mắn và học tập hiệu quả!

thẻ:

  • http
  • bí danh
  • nhanh nhẹn
Thêm thẻ

1. Giao thức HTTP. Giới thiệu

Tôi muốn làm rõ ngay một điều nhỏ. Giao thức từ khủng khiếp không gì khác hơn là sự đồng ý của nhiều người, chỉ tại một thời điểm tốt đẹp, mọi người quyết định: “Hãy làm theo cách này, và rồi mọi thứ sẽ ổn thôi”. Không có gì phải sợ hãi, mọi thứ chỉ đơn giản là thái quá và bây giờ chúng tôi sẽ tiết lộ sự ô nhục này. Vậy giao thức HTTP là gì và nó dùng để làm gì?

1.1 Máy khách và máy chủ

Không có phép màu nào trên thế giới, đặc biệt là trong thế giới lập trình và Internet! Hãy chấp nhận điều này như một sự thật không thể lay chuyển. Và nếu chương trình không hoạt động hoặc không hoạt động như mong muốn thì rất có thể chương trình đó được viết sai hoặc có lỗi. Vậy làm thế nào để trình duyệt yêu cầu máy chủ gửi bất cứ thứ gì? Vâng, rất đơn giản! Bạn chỉ cần thư giãn một chút và bắt đầu tận hưởng quá trình :-)

1.2. Viết yêu cầu HTTP đầu tiên của chúng tôi

Nếu bạn nghĩ rằng mọi thứ quá phức tạp thì bạn đã nhầm. Con người được thiết kế theo cách mà đơn giản là anh ta không có khả năng tạo ra thứ gì đó phức tạp, nếu không bản thân anh ta sẽ bối rối trong đó :-) Vì vậy, có một trình duyệt và có một máy chủ Web. Trình duyệt luôn là người khởi xướng việc trao đổi dữ liệu. Máy chủ Web sẽ không bao giờ đơn giản gửi bất kỳ thứ gì cho bất kỳ ai để nó gửi thứ gì đó tới trình duyệt - trình duyệt phải yêu cầu điều đó. HTTP đơn giản nhất Ví dụ: yêu cầu có thể trông như thế này:


NHẬN http: //www.php.net/ HTTP/1.0rnrn


* GET (dịch từ tiếng Anh có nghĩa là “get”) - loại yêu cầu, loại yêu cầu có thể khác nhau, ví dụ POST, HEAD, PUT, DELETE (chúng ta sẽ xem xét một số trong số chúng bên dưới).
* http://www.php.net/ - URI (địa chỉ) mà từ đó chúng tôi muốn nhận được ít nhất một số thông tin (đương nhiên, chúng tôi hy vọng tìm hiểu được trang HTML).
* HTTP/1.0 - loại và phiên bản của giao thức mà chúng tôi sẽ sử dụng khi liên lạc với máy chủ.
* rn - cuối dòng, phải được lặp lại hai lần; tại sao sẽ rõ ràng sau đó.

Bạn có thể thực hiện yêu cầu này rất đơn giản. Chạy chương trình telnet.exe, nhập www.php.net làm máy chủ, chỉ định cổng 80 và chỉ cần nhập yêu cầu này bằng cách nhấn Enter hai lần dưới dạng rnrn. Đáp lại bạn sẽ nhận được mã HTML trang chủ trang web www.php.net.

1.3 Cấu trúc yêu cầu

Hãy xem yêu cầu HTTP bao gồm những gì. Mọi thứ khá đơn giản. Hãy bắt đầu với thực tế là yêu cầu HTTP là một văn bản hoàn toàn có ý nghĩa. Nó bao gồm những gì? trường hợp chung? Chúng tôi sẽ xem xét giao thức HTTP 1.0. Vì thế :


Yêu cầu - Dòng [ Chung - Tiêu đề | Yêu cầu - Tiêu đề | Thực thể - Tiêu đề ] rn [ Thực thể - Nội dung ]


* Dòng yêu cầu - dòng yêu cầu
*

Định dạng : "Phương thức yêu cầu-URI HTTP-Phiên bản"
* Phương pháp -
phương thức xử lý tài nguyên URI yêu cầu có thể là GET, POST, PUT, DELETE hoặc HEAD.
* URI yêu cầu - tương đối hoặc tham chiếu tuyệt đối tới một trang có tập hợp các tham số, ví dụ: /index.html hoặc http://www.myhost.ru/index.html hoặc /index.html?a=1&b=qq. Trong trường hợp sau, máy chủ sẽ được gửi một yêu cầu với một tập hợp các biến a và b với các giá trị tương ứng và dấu “&” - dấu và - đóng vai trò là dấu phân cách giữa các tham số.
* Phiên bản HTTP - phiên bản Giao thức HTTP, trong trường hợp của chúng tôi là "HTTP/1.0".

Chúng tôi cực kỳ quan tâm đến phương thức xử lý GET và POST. Với phương thức GET, bạn có thể chỉ cần truyền tham số cho tập lệnh và với phương thức POST, bạn có thể mô phỏng việc gửi biểu mẫu.

Đối với phương thức GET, URI yêu cầu có thể trông như sau: "/index.html?param1=1¶m2=2".

* General-Header - phần chính của tiêu đề.
Định dạng:
Chỉ có thể có hai tham số: Date hoặc Pragma. Ngày - Ngày Greenwich ở định dạng "Ngày trong tuần, Ngày Tháng Năm HH:MM:SS GMT", ví dụ: "Thứ Ba, 15 tháng 11 năm 1994 08:12:31 GMT" - ngày tạo yêu cầu. Pragma có thể có một giá trị không có bộ đệm, giá trị này sẽ vô hiệu hóa bộ đệm trang.

* Tiêu đề yêu cầu - một phần của tiêu đề mô tả yêu cầu.

Tiêu đề yêu cầu có thể có các tham số sau : Cho phép, Ủy quyền, Từ, If-Modified-Since, Người giới thiệu, Tác nhân người dùng.
Trong chương này, chúng tôi sẽ không đề cập đến tham số Ủy quyền vì nó được sử dụng để truy cập tài nguyên đóng, điều này không được yêu cầu thường xuyên. Bạn có thể tìm hiểu cách tự tạo tiêu đề truy cập được ủy quyền tại www.w3c.org.

* Cho phép - đặt các phương thức xử lý được chấp nhận.
Định dạng: "Cho phép: NHẬN | ĐẦU".
Tham số này bị bỏ qua khi chỉ định phương thức xử lý POST trong Dòng yêu cầu. Chỉ định các phương pháp xử lý yêu cầu được chấp nhận. Máy chủ proxy không sửa đổi tham số Cho phép và nó không thay đổi đến máy chủ.

* Từ - địa chỉ email người đã gửi yêu cầu.
Định dạng: "Từ: adderssrn".
Ví dụ: "Từ: [email được bảo vệ]".

* If-Modified-Since - chỉ ra rằng yêu cầu chưa được sửa đổi kể từ thời điểm đó.
Định dạng: "If-Modified-Since: datern"
Chỉ được sử dụng cho phương thức xử lý GET. Ngày được chỉ định theo GMT ở cùng định dạng với tham số Ngày trong Tiêu đề chung.

* Người giới thiệu - một liên kết tuyệt đối đến trang mà từ đó yêu cầu được bắt đầu, tức là một liên kết đến trang mà người dùng đã đến trang của chúng tôi.
Định dạng: "Người giới thiệu: urln".
Ví dụ: "Người giới thiệu: www.host.ru/index.htmln".
* Tác nhân người dùng - loại trình duyệt.
Ví dụ: "Tác nhân người dùng: Mozilla/4.0n"

* Tiêu đề thực thể - một phần của tiêu đề mô tả dữ liệu Nội dung thực thể.
Phần yêu cầu này chỉ định các tham số mô tả nội dung của trang. Tiêu đề thực thể có thể chứa các tham số sau: Cho phép, Mã hóa nội dung, Độ dài nội dung, Loại nội dung, Hết hạn, Sửa đổi lần cuối, tiêu đề mở rộng.

* Cho phép - một tham số tương tự như Cho phép từ General-Header.

* Content-Encoding - Kiểu mã hóa dữ liệu Entity-Body.
Định dạng: "Mã hóa nội dung: x-gzip | x-compress | loại khác".
Ví dụ: "Mã hóa nội dung: x-gzipn". Ký tự "|" có nghĩa là từ “hoặc”, tức là cái này hay cái kia hoặc cái kia, v.v.
Một loại khác có thể chỉ ra cách dữ liệu được mã hóa, ví dụ: phương thức ĐĂNG: "Mã hóa nội dung: application/x-www-form-urlencodedn".

* Độ dài nội dung - số byte được gửi đến Nội dung thực thể. Giá trị Độ dài nội dung có ý nghĩa hoàn toàn khác đối với dữ liệu được gửi ở định dạng MIME, trong đó nó hoạt động như một tham số để mô tả một phần của dữ liệu - "bên ngoài/nội dung thực thể". Số hợp lệ là số nguyên từ 0 trở lên.
Ví dụ: "Độ dài nội dung: 26457n".

* Content-Type - loại dữ liệu được truyền đi.
Ví dụ: "Loại nội dung: văn bản/htmln".

* Hết hạn - Thời điểm trang cần được xóa khỏi bộ đệm của trình duyệt.
Định dạng: "Hết hạn: ngày". Định dạng ngày giống với định dạng ngày cho tham số Ngày từ Tiêu đề chung.

* Sửa đổi lần cuối - thời gian thay đổi cuối cùng của dữ liệu đã gửi.
Định dạng: "Sửa đổi lần cuối: ngày". Định dạng ngày giống với định dạng ngày cho tham số Ngày từ Tiêu đề chung.

* Tiêu đề mở rộng - một phần của tiêu đề, chẳng hạn, có thể được dự định xử lý bởi trình duyệt hoặc chương trình khác nhận tài liệu. Trong phần này, bạn có thể mô tả các tham số của mình ở định dạng "Tên tham số: giá trị tham số". Các tham số này sẽ bị bỏ qua nếu chương trình máy khách không biết cách xử lý chúng.
Ví dụ: "Cookie: r=1rn" - đặt các cookie phổ biến cho trang.

Và bây giờ, sau những lời nói khủng khiếp như vậy, chúng ta hãy cố gắng bình tĩnh lại một chút và hiểu mình cần gì? Đương nhiên, chúng ta sẽ hiểu qua các ví dụ.

Hãy tưởng tượng rằng chúng ta cần lấy một trang từ trang web bằng cách chuyển Cookies, nếu không, chúng ta sẽ chỉ bị coi là khách không mời và hơn nữa, bạn chỉ được phép truy cập trang này sau khi bạn đã truy cập trang chính của địa điểm.

2 phương thức GET

Hãy viết yêu cầu của chúng tôi.


NHẬN http:
Máy chủ: www. địa điểm. chạy

Cookie: thu nhập = 1rn
rn


Yêu cầu này cho chúng tôi biết rằng chúng tôi muốn lấy nội dung của trang tại http://www.site.ru/news.html bằng phương thức GET. Trường Máy chủ chỉ ra rằng trang nàyđược đặt trên máy chủ www.site.ru, trường Người giới thiệu cho biết rằng chúng tôi đến để lấy tin tức từ trang chính của trang web và trường Cookie cho biết rằng chúng tôi đã được chỉ định một cookie như vậy. Tại sao các trường Máy chủ, Người giới thiệu và Cookie lại quan trọng đến vậy? Bởi vì các lập trình viên bình thường khi tạo các trang web động sẽ kiểm tra các trường dữ liệu xuất hiện trong script (bao gồm cả PHP) dưới dạng biến. Cái này để làm gì? Ví dụ: để ngăn chặn trang web bị cướp, tức là. họ không cài đặt chương trình để tự động tải xuống hoặc để một người truy cập trang web sẽ luôn chỉ truy cập được từ trang chính, v.v.

Bây giờ hãy tưởng tượng rằng chúng ta cần điền vào các trường biểu mẫu trên trang và gửi yêu cầu từ biểu mẫu, hãy để có hai trường trong biểu mẫu này: thông tin đăng nhập và mật khẩu (đăng nhập và mật khẩu) - và tất nhiên, chúng ta biết thông tin đăng nhập và mật khẩu.


NHẬN http: //www.site.ru/news.html?login=Petya%20Vasechkin&password=qq HTTP/1.0rn
Máy chủ: www. địa điểm. chạy
Người giới thiệu: http : //www.site.ru/index.htmlrn
Cookie: thu nhập = 1rn
rn


Thông tin đăng nhập của chúng tôi là "Petya Vasechkin" Tại sao chúng tôi nên viết Petya%20Vasechkin? Điều này là do Ký hiệu đặc biệt có thể được máy chủ nhận ra là dấu hiệu cho thấy sự hiện diện của một tham số mới hoặc sự kết thúc của một yêu cầu, v.v. Vì vậy, có một thuật toán mã hóa tên tham số và giá trị của chúng nhằm tránh tình trạng lỗi trong yêu cầu. Mô tả đầy đủ của thuật toán này có thể được tìm thấy ở đây và PHP có các hàm rawurlencode và rawurldecode để mã hóa và giải mã tương ứng. Tôi muốn lưu ý rằng PHP tự giải mã nếu các tham số được mã hóa được chuyển trong yêu cầu. Điều này kết thúc chương đầu tiên làm quen với giao thức HTTP của tôi. Trong chương tiếp theo, chúng ta sẽ xem xét việc xây dựng các yêu cầu như POST (dịch từ tiếng Anh là “gửi”), điều này sẽ thú vị hơn nhiều, bởi vì chính xác loại này yêu cầu được sử dụng khi gửi dữ liệu từ các biểu mẫu HTML.

3. Phương thức POST.

Trong trường hợp yêu cầu HTTP POST, có hai tùy chọn để chuyển các trường từ biểu mẫu HTML, đó là sử dụng thuật toán application/x-www-form-urlencoded và multipart/form-data. Sự khác biệt giữa các thuật toán này là khá đáng kể. Thực tế là loại thuật toán đầu tiên đã được tạo ra từ lâu, khi ngôn ngữ HTML vẫn chưa cung cấp khả năng truyền tập tin qua biểu mẫu HTML. Vì vậy, hãy xem xét các thuật toán này bằng các ví dụ.

3.1 Loại nội dung: application/x-www-form-urlencoded.

Chúng ta viết một yêu cầu tương tự như yêu cầu GET để chuyển thông tin đăng nhập và mật khẩu, đã được thảo luận ở chương trước:


ĐĂNG http: //www.site.ru/news.html HTTP/1.0rn
Máy chủ: www. địa điểm. chạy
Người giới thiệu: http : //www.site.ru/index.htmlrn
Cookie: thu nhập = 1rn
Nội dung - Loại: ứng dụng / x - www - biểu mẫu - urlencodedrn
Nội dung - Độ dài : 35rn
rn


Ở đây chúng ta thấy một ví dụ về cách sử dụng các trường tiêu đề Loại nội dung và Độ dài nội dung. Độ dài nội dung cho biết vùng dữ liệu sẽ chiếm bao nhiêu byte, được phân tách khỏi tiêu đề bằng một nguồn cấp dữ liệu dòng khác. Tuy nhiên, các tham số trước đây được đặt trong URI yêu cầu cho yêu cầu GET hiện nằm trong Phần thân thực thể. Có thể thấy chúng được hình thành giống hệt nhau, bạn chỉ cần viết chúng sau tiêu đề là được. Tôi muốn chỉ ra một điều nữa tâm điểm, không có gì ngăn cản, đồng thời với tập hợp các tham số trong Entity-Body, đặt các tham số có tên khác trong URI yêu cầu, ví dụ:


ĐĂNG http: //www.site.ru/news.html?type=user HTTP/1.0rn
.....
rn
đăng nhập = Petya% 20Vasechkin & mật khẩu = qq


3.2 Loại nội dung: nhiều phần/biểu mẫu dữ liệu

Ngay khi thế giới Internet nhận ra rằng việc gửi tệp qua biểu mẫu sẽ rất tốt, tập đoàn W3C đã bắt tay vào việc tinh chỉnh định dạng ĐĂNG yêu cầu MỘT. Vào thời điểm đó, định dạng MIME (Phần mở rộng thư Internet đa năng - phần mở rộng giao thức đa mục đích để tạo Tin nhắn thư), do đó, để không phát minh lại bánh xe, chúng tôi quyết định sử dụng một phần định dạng này tạo thông báo để tạo yêu cầu POST trong giao thức HTTP.

Sự khác biệt chính giữa định dạng này và loại ứng dụng/x-www-form-urlencoded là gì?

Sự khác biệt chính là Entity-Body giờ đây có thể được chia thành các phần, được phân tách bằng ranh giới (ranh giới). Điều thú vị nhất là mỗi phần có thể có tiêu đề riêng để mô tả dữ liệu được lưu trữ trong đó, tức là. Bạn có thể chuyển dữ liệu trong một yêu cầu nhiều loại khác nhau(Làm thế nào Thư thư Bạn có thể chuyển tập tin đồng thời với văn bản).

Vậy hãy bắt đầu. Hãy xem xét lại ví dụ tương tự về việc chuyển thông tin đăng nhập và mật khẩu, nhưng bây giờ ở định dạng mới.


ĐĂNG http: //www.site.ru/news.html HTTP/1.0rn
Máy chủ: www. địa điểm. chạy
Người giới thiệu: http : //www.site.ru/index.htmlrn
Cookie: thu nhập = 1rn

Nội dung - Độ dài : 209rn
rn
-- 1BEF0A57BE110FD467Arn
Nội dung - Bố trí : biểu mẫu - dữ liệu ; name = "đăng nhập" rn
rn
Petya Vasechkinrn
-- 1BEF0A57BE110FD467Arn
Nội dung - Bố trí : biểu mẫu - dữ liệu ; tên = "mật khẩu" rn
rn
qqrn
-- 1BEF0A57BE110FD467A -- rn


Bây giờ hãy hiểu những gì được viết. :-) Tôi đã cố tình đánh dấu một số ký tự rn in đậm để chúng không hợp nhất với dữ liệu. Nếu để ý kỹ, bạn sẽ thấy trường ranh giới sau Content-Type. Trường này chỉ định dấu phân cách phần - đường viền. Ranh giới có thể là một chuỗi bao gồm chữ cái Latinh và các con số, cũng như một số ký hiệu khác (thật không may là tôi không nhớ đó là ký hiệu nào). Trong nội dung yêu cầu, “--” được thêm vào phần đầu của ranh giới và yêu cầu kết thúc bằng một ranh giới mà các ký tự “--” cũng được thêm vào cuối. Yêu cầu của chúng tôi có hai phần, phần đầu tiên mô tả trường đăng nhập và phần thứ hai mô tả trường mật khẩu. Bố trí nội dung (loại dữ liệu trong phần) cho biết đây sẽ là dữ liệu từ biểu mẫu và trường tên chỉ định tên của trường. Đây là nơi tiêu đề phần kết thúc và phần tiếp theo là vùng dữ liệu phần trong đó giá trị trường được đặt (không cần mã hóa giá trị!).

Tôi muốn bạn chú ý đến thực tế là bạn không cần sử dụng Độ dài nội dung trong tiêu đề phần, nhưng trong tiêu đề yêu cầu thì bạn nên sử dụng và giá trị của nó là kích thước của toàn bộ Nội dung thực thể, xuất hiện sau rn thứ hai Độ dài nội dung sau: 209rn. Những thứ kia. Phần thân thực thể được phân tách khỏi tiêu đề bằng dấu ngắt dòng bổ sung (cũng có thể thấy trong các phần).

Bây giờ hãy viết một yêu cầu để chuyển một tập tin.


ĐĂNG http: //www.site.ru/postnews.html HTTP/1.0rn
Máy chủ: www. địa điểm. chạy
Người giới thiệu: http://www.site.ru/news.htmlrn
Cookie: thu nhập = 1rn
Loại nội dung: nhiều phần/biểu mẫu dữ liệu; ranh giới = 1BEF0A57BE110FD467Arn
Nội dung - Độ dài : 491rn
rn
-- 1BEF0A57BE110FD467Arn
Nội dung - Bố trí : biểu mẫu - dữ liệu ; name = "news_header" rn
rn
Bản tin ví dụ
-- 1BEF0A57BE110FD467Arn
Nội dung - Bố trí : biểu mẫu - dữ liệu ; name="news_file" ; tên file = "news.txt" rn
Nội dung - Loại: ứng dụng/octet - luồng
Nội dung - Chuyển giao - Mã hóa : nhị phân
rn
Đây là tin tức, cái đó có trong tập tin tin tức. txtrn
-- 1BEF0A57BE110FD467A -- rn


TRONG trong ví dụ này phần đầu tiên gửi tiêu đề tin tức và phần thứ hai gửi tệp news.txt. Nếu để ý, bạn sẽ thấy các trường tên tệp và Loại nội dung trong phần thứ hai. Trường tên tệp chỉ định tên của tệp được gửi và trường Loại nội dung chỉ định loại tệp này. Ứng dụng/octet-stream chỉ ra rằng đây là luồng dữ liệu tiêu chuẩn và Content-Transfer-Encoding: nhị phân chỉ ra rằng đây là dữ liệu nhị phân, không được mã hóa theo bất kỳ cách nào.

Một điểm rất quan trọng. Số đông kịch bản CGI bằng văn bản người thông minh, vì vậy họ muốn kiểm tra loại tệp đến, nằm trong Content-Type. Để làm gì? Thông thường, việc tải tệp lên các trang web được sử dụng để nhận hình ảnh từ khách truy cập. Vì vậy, chính trình duyệt sẽ cố gắng xác định loại tệp mà khách truy cập muốn gửi và chèn Loại nội dung thích hợp vào yêu cầu. Tập lệnh sẽ kiểm tra nó khi nhận được và, ví dụ: nếu nó không phải là gif hoặc jpeg, nó sẽ bỏ qua nó tập tin này. Do đó, khi tạo yêu cầu “thủ công”, hãy chú ý đến giá trị Content-Type sao cho gần nhất với định dạng của tệp được truyền.

Hình ảnh/gif cho gif
hình ảnh/jpeg cho jpeg
hình ảnh/png cho png
hình ảnh/tiff cho tiff (rất hiếm khi được sử dụng, định dạng quá dung lượng)

Trong ví dụ của chúng tôi, một yêu cầu được tạo ra trong đó tập tin văn bản. Yêu cầu chuyển tệp nhị phân được tạo theo cách tương tự.

4. Phần tái bút.

Tôi nghĩ rằng không cần phải nói chi tiết về việc gửi yêu cầu đến máy chủ. Đây là vấn đề của công nghệ RHP thuần túy :-). Chỉ cần đọc kỹ phần về các chức năng làm việc với socket hoặc về các chức năng của mô-đun CURL trong tài liệu chính thức RNR.

Từ những điều trên, tôi hy vọng giờ đây bạn đã hiểu rõ lý do tại sao câu hỏi là: “Làm cách nào tôi có thể tạo yêu cầu POST bằng chức năng tiêu đề?” - vô nghĩa. Hàm tiêu đề (chuỗi) chỉ thêm một mục nhập vào tiêu đề yêu cầu chứ không thêm vào nội dung yêu cầu.

Mặt sau

Một yêu cầu hoặc thông báo HTTP bao gồm ba phần: dòng truy vấn và phần nội dung Thông báo HTTP.

Chuỗi truy vấn hoặc dòng bắt đầu: trong yêu cầu tới máy chủ, một dòng chứa loại yêu cầu (phương thức), URI của trang được yêu cầu và phiên bản (ví dụ: HTTP/1.1). Trong phản hồi từ máy chủ, dòng này chứa phiên bản giao thức HTTP và mã phản hồi. Mã phản hồi là một số nguyên có ba chữ số. Theo sau nó thường là một cụm từ giải thích được phân tách bằng dấu cách để giải thích mã, ví dụ: 200 OK hoặc 404 Not Found.

Phương thức yêu cầu HTTP (loại): NHẬN, ĐĂNG, ĐẶT, PATCH, ĐẦU, XÓA, THEO DÕI. Thông thường, phương thức GET hoặc POST được sử dụng trong yêu cầu HTTP: GET được sử dụng để yêu cầu nội dung của trang web tại URI được chỉ định. URI là địa chỉ của trang mà không chỉ định , ví dụ: /internet/chto-takoe-http-zapros-soobshhenie/ thay vì site/internet/chto-takoe-http-zapros-soobshhenie/. Trình duyệt có thể truyền tham số trong GET trong URI sau dấu "? ": NHẬN /index.php?param1=value1¶m2=value2. Ngoại trừ phương pháp thông thường GET thì cũng có GET có điều kiện và GET một phần. có điều kiện NHẬN yêu cầu chứa If-Modified-Since , If-Match , If-Range và các tiêu đề tương tự.

POST - dùng để gửi thông tin tới . Khi gửi dữ liệu bằng phương thức POST, nó được biểu thị trong phần nội dung của thông báo HTTP chứ không phải trong dòng nhập địa chỉ trong trình duyệt, như được thực hiện khi gửi dữ liệu bằng phương thức GET. Ví dụ: khi gửi nhận xét thông qua biểu mẫu nằm bên dưới bài viết, thông tin sẽ được truyền đến máy chủ bằng phương thức POST. Các tập tin cũng được tải lên máy chủ bằng phương thức POST.

- đây là phần của yêu cầu có chứa thông số khác nhau, được sử dụng để xây dựng một trang web một cách chính xác.

Nội dung tin nhắn HTTP— chứa dữ liệu nhận được từ máy chủ, ví dụ: một trang web được tạo ở dạng mã HTML hoặc tài nguyên, ví dụ như hình ảnh.

Tin nhắn HTTP ví dụ:

Yêu cầu HTTP tới máy chủ:

GET /internet/chto-takoe-http-zapros-soobshhenie/ HTTP/1..9,image/webp,*/*;q=0.8 Tác nhân người dùng: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ( KHTML, like Gecko) Chrome/40.0.2150.0 Mã hóa chấp nhận: gzip, deflate, sdch Ngôn ngữ chấp nhận: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: wp- settings-1=hidetb%3D; wp-settings-time-1=1424958215; wordpress_test_cookie=WP+Cookie;

Phản hồi từ máy chủ:

HTTP/1.1 200 Được - dòng bắt đầu phản hồi: Máy chủ: nginx/1.6.2 Ngày: Chủ nhật, ngày 19 tháng 4 năm 2015 00:22:50 GMT Loại nội dung: văn bản/html; charset=UTF-8 Độ dài nội dung: 9431 Kết nối: keep-alive Keep-Alive: timeout=30 X-Powered-By: PHP/5.5.22 Hết hạn: Thứ Tư, ngày 11 tháng 1 năm 1984 05:00:00 GMT Kiểm soát bộ đệm: no-cache, must-revalidate, max-age=0 Pragma: no-cache Vary: Accept-Encoding Content-Encoding: gzip Nội dung phản hồi (trang html) theo sau.