<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>I wanna be developer &#187; HTTP</title>
	<atom:link href="http://iwannabedeveloper.com/category/http/feed/" rel="self" type="application/rss+xml" />
	<link>http://iwannabedeveloper.com</link>
	<description>Как стать разработчиком с большой буквы Р</description>
	<lastBuildDate>Wed, 29 Dec 2010 12:51:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Передача данных при HTTP запросе</title>
		<link>http://iwannabedeveloper.com/2007/10/sending_data_with_http/</link>
		<comments>http://iwannabedeveloper.com/2007/10/sending_data_with_http/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 22:36:28 +0000</pubDate>
		<dc:creator>Родион Быков</dc:creator>
				<category><![CDATA[HTTP]]></category>

		<guid isPermaLink="false">http://iwannabedeveloper.com/2007/10/13/sending_data_with_http/</guid>
		<description><![CDATA[Представьте что вы &#8211; редколлегия студенческого журнала. Денег на издание журнала &#8220;в формате мертвого дерева&#8221; само собой у вас нет, поэтому вы мудро решаете издаваться в web, допустим на &#8220;шаровом&#8221; сервере предоставленном университетом. Вы отсканировали архив статей и набили новые статьи в файлы. Теперь надо как то разместить их в web. Можно создать весь сайт [...]]]></description>
			<content:encoded><![CDATA[<p>Представьте что вы &#8211; редколлегия студенческого журнала. Денег на издание журнала &#8220;в формате мертвого дерева&#8221; само собой у вас нет, поэтому вы мудро решаете издаваться в web, допустим на &#8220;шаровом&#8221; сервере предоставленном университетом. Вы отсканировали архив статей и набили новые статьи в файлы. Теперь надо как то разместить их в web. Можно создать весь сайт на чистом HTML, тупо верстая каждую страницу&#8230; Но именно для того, чтобы не заниматься тупой работой, создавая однотипные файлы Statya1.html, Statya2.html и так еще 348 раз, можно отмучаться один раз, создав файл Statya.php и с помощью него отображать все 350 статей вашего студенческого журнала. Но все-же чего то не хватает. Как же скрипт Statya.php узнает, какую именно статью пожелал увидеть пользователь на экране своего браузера ? </p>
<p>Для этой благородной цели был разработан механизм передачи дополнительных параметров от клиента серверу при запросе. </p>
<p><strong>Параметры передаваемые в строке запроса</strong></p>
<p>Допустим вы хотите создать страницу на которой выводится 350 ссылок на все статьи вашего сайта. Каждая из ссылок должна иметь такой вид:<br />
Statya.php?id=1 Statya.php?id=2 и так далее. Такая запись позволяет передать на сервер не только название запрашиваемого скрипта, но и идентификатор статьи которую хотите вывести на экран. Если ваши статьи идентифицируются не числовым ключем, а текстовым, то можно например передавать такой параметр: Statya.php?nazvanie=Peredacha+dannih+v+HTTP+zaprose. Пробелы в таком случае будут заменены символом +, а также будут заменены другие служебные символы. Это требование накладывается стандартом RFC1738 который определяет вид строки запроса (URI). Так как параметры очевидно являются частью URI &#8211; то требования стандарта распространяются и на них. Если надо передать больше чем 1 параметр, строка запроса выглядит так: Statya.php?id=230&#038;category=10 &#8211; то есть параметры разделяются символом амперсанда (&#038;).</p>
<p>Когда пользователь нажмет такую ссылку, браузер пошлет серверу запрос такого вида:</p>
<pre><code>GET /Statya.php?id=23 HTTP/1.1
Host: student-journal.com</code></pre>
<p>То есть, браузер, используя метод протокола HTTP GET, &#8220;попросит&#8221; сервер выдать (или выполнить) Statya.php и все параметры будут переданы тут-же вместе с именем запрошенного файла. Достоинство метода очевидно &#8211; можно легко сгенерировать ссылку нужного вида и передать серверу на обработку. Недостаток этого метода в том, что таким образом нельзя передать данные большого объема или содержащие символы не из таблицы ASCII и двоичную информацию (файлы). Хотя стандарт RFC2616 не накладывает ограничения длину заголовка запроса вообще и на длину строки запроса (URI) в частности, такие ограничения накладываются браузерами, web-серверами и прокси-серверами. Обычно не стоит делать длину запроса больше 2000 символов.</p>
<p><strong>Посылка форм</strong></p>
<p>Форма как один из важнейших HTML-элементов позволяет передавать серверу вводимые пользователем сайта данные. В простейшем, но рабочем, случае форму можно определить как:</p>
<pre><code>&lt;form action="search.php"&gt;
&lt;input type="text" name="search"/&gt; &lt;input type="submit" value="Search"/&gt;
&lt;/form&gt;</code></pre>
<p>Эта форма поиска примет от пользователя строку текста в поле и отправит на сервер странице search.php. Так как мы не задали атрибут method, по умолчанию будет использован метод GET. Запрос посылаемый серверу в этом случае ничем не будет отличаться от первого случая &#8211; когда пользователь нажимал на ссылку.</p>
<pre><code>GET /search.php?search=blabla HTTP/1.1
Host: student-journal.com</code></pre>
<p>Получается, мы опять сталкиваемся с ограничением на длину вводимых данных. Как-же например передать на сервер текст статьи из 20-30 страниц ? Надо воспользоваться методом POST. При запросе GET не используется тело запроса, а только заголовок. При запросе POST можно передать данные в теле запроса. Для этого изменим форму:</p>
<pre><code>&lt;form method="post" action="search.php"&gt;
&lt;input type="text" name="search"/&gt; &lt;input type="submit" value="Search"/&gt;
&lt;/form&gt;</code></pre>
<p>В этом случае, при посылаемый запрос будет иметь такой вид:</p>
<pre><code>POST /search.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
Host: student-journal.com

search=blabla</code></pre>
<p>Как видно, параметры теперь посылаются в теле запроса, а длина запрашиваемого URL значительно сокращается. Опять же, по стандарту нет никаких ограничений на длину посылаемых в теле запроса данных, однако такие ограничения вводятся администраторами веб-серверов для предотвращения атак на сайты. В любом случае, эти ограничения происходят из здравого смысла, и например для сайтов посвященных музыке ограничения будут в районе десятков мегабайт &#8212; чтобы можно было загружать mp3 файлы. Загрузка файлов через веб-браузер &#8211; тема интересная и заслуживает отдельного изложения.</p>
<p><strong>Ссылки по теме</strong></p>
<p><noindex><a rel="nofollow" href="http://www.w3.org/TR/html4/interact/forms.html">Стандарт на посылку форм в HTTP запросах</a></noindex><br />
<noindex><a rel="nofollow" href="http://support.microsoft.com/default.aspx?scid=KB;en-us;q208427">Записка Microsoft о максимальной длине строки запроса (URI)</a></noindex><br />
<noindex><a rel="nofollow" href="http://www.boutell.com/newfaq/misc/urllength.html">Опыты по определению максимальной длины строки запроса</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://iwannabedeveloper.com/2007/10/sending_data_with_http/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Анатомия HTTP запроса</title>
		<link>http://iwannabedeveloper.com/2007/06/http-request-anatomy/</link>
		<comments>http://iwannabedeveloper.com/2007/06/http-request-anatomy/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 14:00:06 +0000</pubDate>
		<dc:creator>Родион Быков</dc:creator>
				<category><![CDATA[HTTP]]></category>

		<guid isPermaLink="false">http://iwannabedeveloper.com/2007/06/25/%d0%b0%d0%bd%d0%b0%d1%82%d0%be%d0%bc%d0%b8%d1%8f-http-%d0%b7%d0%b0%d0%bf%d1%80%d0%be%d1%81%d0%b0/</guid>
		<description><![CDATA[Занимаясь веб-разработкой профессионально, нельзя не знать как все работает до последней шестеренки. Поэтому я считаю будет уместно рассказать о том как происходит взаимодействие сервера и клиента и для этого препарировать HTTP протокол как основу такого взаимодействия. Когда вы пробовали создавать первые HTML страницы, вы либо открывали их через двойное нажатие мышкой браузером прямо с диска [...]]]></description>
			<content:encoded><![CDATA[<p>Занимаясь веб-разработкой профессионально, нельзя не знать как все работает до последней шестеренки. Поэтому я считаю будет уместно рассказать о том как происходит взаимодействие сервера и клиента и для этого препарировать HTTP протокол как основу такого взаимодействия.</p>
<p>Когда вы пробовали создавать первые HTML страницы, вы либо открывали их через двойное нажатие мышкой браузером прямо с диска (файловой системы), либо выкладывали на локальный или удаленный web-сервер и открывали браузером URL. В обоих случаях, результать один и тот-же &#8211; вы видете HTML страницу в браузере. Однако, когда вы открываете страницу расположенную на web-сервере через HTTP протокол, неявно передается достаточно много дополнительной информации, а именно <em>заголовки HTTP</em>. Протокол передачи &#8211; это договор между сервером и клиентом о допустимых вопросах и ответах. Протокол задокументирован в виде стандарта <noindex><a rel="nofollow" href="http://www.w3.org/Protocols/rfc2616/rfc2616.html">RFC2616</a></noindex>.</p>
<p>Общение между сервером и клиентом может быть описано как разговор человека в магазине:<br />
<em><br />
Клиент: Привет! Я Мозилла-Файрфокс, можно-ли мне файлик products.html с хоста shop.com ?<br />
Сервер: Да, есть у меня такой файлик, он имеет тип text|/html и вот его содержимое.<br />
(Клиент получает целиком файл, смотрит на него и натыкается на тег &lt;img&gt;)<br />
Клиент: Привет! Я Мозилла-Файрфокс, можно ли мне файлик product.jpg с хоста shop.com ?<br />
Сервер: Да, есть у меня такой файлик, он имеет тип image/jpg и вот его содержимое.<br />
(Клиент получает файл и отображает на экране)<br />
</em><br />
И так далее. Что кстати сразу замечу &#8211; сервер <em>понятия не имеет</em> что оба раза это был один и тот же клиент. HTTP-протокол называется &#8220;stateless&#8221; &#8211; он не хранит состояние соединения и передачи. Вопрос &#8211; ответ &#8211; &#8220;вiльна каса&#8221;.</p>
<p>Вернемся к заголовкам. Они бывают двух типов &#8211; заголовки запроса (request) и заголовки ответа (response). Например, вы набираете URL нашего сайта и он открывается. На языке современного протокола HTTP версии 1.1 это выглядит так:</p>
<p>Запрос:<br />
<code><br />
GET / HTTP/1.1<br />
Host: iwannabedeveloper.com<br />
User-Agent: Mozilla/5.0<br />
</code></p>
<p>Ответ сервера:<br />
<code><br />
HTTP/1.1 200 OK<br />
Date: Mon, 25 Jun 2007 13:50:37 GMT<br />
Server: Apache/2.0.46 (CentOS)<br />
Accept-Ranges: bytes<br />
X-Powered-By: PHP/4.3.2<br />
X-Pingback: http://iwannabedeveloper.com/xmlrpc.php<br />
Content-Encoding: gzip<br />
Vary: Accept-Encoding<br />
Connection: close<br />
Transfer-Encoding: chunked<br />
Content-Type: text/html; charset=UTF-8</code></p>
<p>После заголовков следует содержимое страницы в виде HTML:</p>
<p><code><br />
&lt; !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</code></p>
<p>Выглядит довольно просто. В запросе клиент указывает какой файл он просит сервер вернуть и опознает себя (хоть и не обязан) как Mozilla. Запрос посылается методом GET, и есть еще метод POST, но о нем в следующий раз. В ответ клиент получает информацию о запрашиваемом файле и сам файл. Наиболее значимые заголовки ответа &#8211; это Content-Type и Status. Content-Type сообщает клиенту какого типа файл будет передаваться, а в случае HTML, какая кодировка будет использоваться. Список типов файлов (MIME-types) стандартизована и с ней можно ознакомится <noindex><a rel="nofollow" href="http://www.iana.org/assignments/media-types/">здесь</a></noindex>. Status &#8211; (200 ОК) &#8211; это стандартизованный код выполнения запроса. Код 200 означает что запрошенный файл был найден и успешно передан клиенту. Например код 404 означает что файл не найден, код 301 &#8211; что файл перемещен в другое место, а код 500 &#8211; что во время выполнения запроса произошла непоправимая ошибка на сервере. Список кодов <noindex><a rel="nofollow" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">описан</a></noindex> в упомянутом стандарте RFC2616.</p>
<p>Вот в кратце как работает HTTP протокол. Есть еще много вопросов которые мы разберем позже &#8211; например, как передаются формы и файлы других типов или как можно управлять передаваемыми заголовками с помощью PHP.</p>
]]></content:encoded>
			<wfw:commentRss>http://iwannabedeveloper.com/2007/06/http-request-anatomy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

