2010-10-08 2 views
5

Я знаю, что хочу знать, что происходит за сценой метода HTTP post. i.e браузер отправляет HTTP-запрос на серверный скрипт в PHP (например).Как применяется метод почтовых сообщений?

Как переменная PHP $ _POST получает значения от клиента.

Не могли бы кто-нибудь объяснить подробности или указать руководство.

ответ

1

Браузер кодирует данные в соответствии с content-type of the form, а затем передает его в виде тела запроса POST. Затем PHP выбирает его и заполняет $_POST именами и значениями (выполняет специальную обработку, когда имя содержит символы [ и ] или .).

+0

что это делает для.) – abel

+0

Он преобразует его в '_' – Quentin

+0

Он превращает' .' в '_' (по историческим причинам, в основном, используется для того, чтобы каждая переменная в форме превратилась в реальную переменную. Google для« register_globals »для получения подробной информации о эта последняя часть). – cHao

0

Я предлагаю получить захват прокси (например, Fiddler) или инструмент захвата сети (например, Wireshark) и некоторое время наблюдать за своим собственным просмотром трафика; это даст вам прекрасный обзор проблемы.

Кроме того, POST скорее похож на GET, за исключением того, что данные отправляются в теле запроса вместо URL-адреса, и есть два способа их кодирования (многочастные данные в дополнение к urlencode, который используется совместно с GET)

+0

Существует несколько способов работы с * формами * в браузере, но XHR POST могут (и обычно) использовать JSON, XML и т. Д., А не кодировку url или multipart/form-data. Конечно, тогда вам обычно нужно читать данные POST и декодировать его самостоятельно. – cHao

4

HTTP-протокол (*) указывает, как браузер должен отправить запрос.

HTTP в основном состоит из набора заголовков в виде обычного текста, разделенных линейными каналами, а затем передаваемых данных. Внутри HTTP-запроса данные POST фактически отформатированы практически так же, как и данные GET; это просто в другой части заголовков HTTP.

Вы можете использовать такие инструменты, как Firebug или Fiddler, чтобы точно определить, как заголовки и данные отформатированы для входящих и исходящих HTTP-запросов. На самом деле все довольно просто читать, поэтому вы должны иметь возможность работать, просто просматривая.

Как только он попадает на сервер, интерпретатор PHP отвечает за перевод необработанных данных запроса HTTP в его стандартные переменные $ _GET, $ _POST и т. Д. Это то, что PHP делает для вас.

Другие языки (например, Perl) не имеют встроенных функций, поэтому программисту Perl необходимо будет иметь код в своей программе для анализа входящих данных запроса в полезные переменные. К счастью, даже Perl имеет стандартную библиотеку, которая может быть включена, которая выполняет эту работу, поэтому даже программистам на Perl обычно не нужно писать код самостоятельно.

Путь PHP и любой другой язык, это просто манипуляции с строкой. Как я уже сказал, HTTP-данные являются обычным текстом и принимаются в простом строковом формате, поэтому это просто случай его разбиения путем разбиения его на вопросительный знак и равные знаковые символы.

Поскольку PHP делает все за кулисами, вам, вероятно, не нужно беспокоиться о конкретных механизмах, которые он использует, но исходный код PHP доступен, если вы действительно хотите это выяснить.

Я сказал, что все это в обычном тексте. HTTPS, конечно, зашифрован. Однако к тому моменту, когда PHP овладеет им, сервер Apache уже выполнил дешифрование, поэтому, насколько это касается PHP, это все еще простой текст.

(*) Прежде, чем кто-нибудь меня подтянет, да, я знаю, что «HTTP-протокол» - это избыточность, например «ATM-машина» или «PIN-код».

+1

Что касается увольнений, как насчет переменных $ _GET, $ _POST? Последнее, что я проверил, любое слово, начинающееся с $, является переменной по определению .... :) (Эй, вы просили об этом.) – cHao

+0

@cHao - хе-хе. да, наверное. :) – Spudley

0

Ну, давайте ilustrate шаг за шагом, начиная с страницы, содержащей [действие формы = «foo.php» метод = «пост»]

После нажатия кнопки отправить (или нажмите клавишу ВВОД), браузер будет инициировать событие с именем «submit». Это событие может быть включено внутри для обработки с помощью javascript/dom, и это то, что делают большинство сайтов для проверки или подпрограммы Ajax.

Если подпрограммы не останавливают поток с возвратом false, браузер продолжает обрабатывать почтовый запрос (этот процесс аналогичен сообщению с объектом XMLHttpRequest).

Браузер проверяет первый метод, действие и кодировку содержимого, затем анализирует входные значения, чтобы знать размер данных, которые он будет отправлять, и кодировать его.

Наконец, отправить что-то вроде этого (сырье значений):

POST /foo.php HTTP/1.1 
Host: example.org 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 7 

foo=bar 

Это запрос POST. Но учтите, что он может отправлять длину контента и отправлять переменные в куски. Браузер и сервер знают, что это может произойти (это цель метода POST). Когда сервер получает запрос POST, он продолжает прослушивать браузер до тех пор, пока содержимое не будет соответствовать длине информированного контента.

Теперь другая сторона. Сервер получает запрос, прослушивает контент, анализирует его (foo = bar; xxx = baz) и делает его доступным в своей среде для этого конкретного запроса, поэтому вы можете поймать его с помощью PHP или Python или Java ...

Вот и все. Ах, обратите внимание, что вы можете передавать как GET, так и POST-переменные в одном запросе!

Используя [действие формы = "foo.php? SomeVar = 123 & anotherVar = TRUE" метод = "сообщение"]

Сделает браузер отправить запрос в

POST /foo.php?someVar=123&anotherVar=TRUE HTTP/1.1 
Host: example.org 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 7 

foo=bar 

и сервер при разборе этого запроса будет сделать следующие переменные доступны:

  • GET [someVar] = 123
  • GET [anotherVar] = TRUE
  • POST [foo] = bar
Смежные вопросы