Интерфейс реализуется последовательно.
Рассмотрим интерфейс взаимодействия программных приложений на примере HTTP.
Первый этап - это когда HTTP-клиент (броузер) соединяется с сервером. Для этого он использует протокол TCP/IP, и соединение происходит с известным клиенту TCP-портом. Принятый номер порта HTTP - 80; для других сервисов определены другие TCP-порты.
Вторым этапом является запрос клиента: клиент передает заголовок запроса (Request header) и, возможно (в зависимости от метода), тело сообщения запроса. В заголовке обязательно указываются метод, URL и версия HTTP. Там может быть еще несколько необязательных полей, которые тоже дают серверу информацию о том, как обрабатывать запрос.
Третий этап - ответ сервера, который состоит из заголовка (Response header), в котором сервер указывает версию HTTP и код статуса, который может говорить об успешном или неуспешном результате и его причинах. После заголовка идет тело ответа, отделенное от заголовка пустой строкой.
Четвертым этапом является разрыв TCP/IP соединения.
Request header может выглядеть следующим образом:
GET /MyDoc.htm HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/3.0 (Win95; I)
Host: 212.54.196.226
Accept: image/gif, image/x-bitmap,
image/jpeg, *.*
Здесь: MyDoc.htm - имя запрашиваемого документа; GET - тип запроса; Host - IP-адрес; Accept- форматы данных "понимаемых" клиентом.
Request header, приведенный ниже, получен от документа, содержащего форму:
POST /Scripts/ReadData.pl HTTP/1.1
Referer: http://212.54.196.226
Connection: Keep Alive
User-Agent: Mozilla/3.0 (Win95; I)
Host: 212.54.196.226
Accept: image/gif, image/x-bitmap,
image/jpeg, *.*
Content-type: application/x-www-form-urlencoded
Content-length: 38
FirstName=Mary+Ann&LastName=Sylvester
Здесь: POST - метод передачи данных из формы; Referer - адрес web-страницы, с которой пользователь перешел на документ, содержащий форму.; Content-type - способ кодировки передаваемых данных; Content-length - количество передаваемых данных (байт); FirstName, LastName - имена полей формы; Mary+Ann, Sylvester - передаваемые значения (пробел заменен знаком "+").
Web-сервер отвечает на запрос браузера, посылая ему HTML-файл, которому предшествует Response header.
Типичный Response header содержит следующие данные:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Tue, 04 Apr 2005 00:26:34 GMT
Content-type: text/html
Set-Cookie: ASPSESSIONIDFFFYXKFR=ACMNFLJANKGBAMPBEGNGLEAB
<HTML>
{ HTML - код }
Этот заголовок сформирован сервером. Строка "200 OK" - это статус запроса. Если бы сервер не смог обработать запрос, то он сформировал бы сообщение об ошибке, например, "404 Object Not Found"; Content-type - тип содержимого. Браузер отображает документ (интерпретирует его код именно как HTML-код, поскольку Content-type имеет значение text/html) и ждет, когда клиент запросит (щелкнув по гиперссылке) очередную страницу этого сайта или перейдет на другой сайт. Если страница содержит изображение (например, формата jpeg), оно будет направлено web-сервером клиенту вместе с другим Response header, где Content-type будет иметь значение image/jpeg. Set-Cookie- устанавливает значение cпециальной информации записываемой на компьютере клиента. В этом поле хранится идентификатор текущей сессии.
Рассмотрим пример и разберём подробнее HTTP запрос клиента. Он может выглядеть например так:
POST http: //localhost/ HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: localhost
Proxy-Connection: Keep-Alive
paraml=l¶m2=2
Из примера видно, что запрос начинается со слова "POST". Это слово означает метод передачи данных на сервер, в котором дополнительные данные запроса (строка "param1=1¶m2=2") передаются после заголовка.
В HTML документах метод передачи данных указывается в форме отправки сообщений. Например, для того, чтобы получить этот запрос, была использована следующая форма:
<form action="http://localhost/" method="post">
<input type=hidden name="param1" value="1">
<input type=hidden name="param2" value="2">
<input type=submit></form>
Как видно из примера, параметры записываются в виде
[имя параметра1]=[значения параметра1]&[имя параметра2]=[значения параметра2] & ...
Часто употребим метод запроса - "GET". Фактически все запросы, не требующие отправки данных - например запрос страницы, производятся этим способом. Изменим форму запроса:
<form action="http://localhost/" method="get">
<input type=hidden name="param1" value="1">
<input type=hidden name="param2" value="2">
<input type=submit></form>
получим следующий HTTP запрос:
GET http://localhost/?param1=1¶m2=2 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: localhost
Proxy-Connection: Keep-Alive
Как видно, строка "paraml=l¶m2=2" переместилась выше и добавилась к строке "http://localhost/" после знака"?". Так же изменилось первое слово в HTTP заголовке, остальное осталось без изменения.
Достоинством метода GET является то, что в строке браузера видно, какие данные были отправлены. К недостаткам же относится то, что длина отправляемых данных таким способом (в отличие от метода POST) ограничена - некоторые серверы, как и некоторые браузеры, имеют лимит на длину адреса запрашиваемого документа. Соответственно адрес с длинной строкой запроса может быть либо срезан, либо сервер возвратит ошибку "414 Request-URI Too Long".
Контрольные вопросы
1. Сколько этапов включает интерфейс взаимодействия приложений по НТТР?
2. Каков смысл заголовка Request header в интерфейсе взаимодействия приложений по НТТР?
3. Каков смысл заголовка Response header в интерфейсе взаимодействия приложений по НТТР?
4. Как компоненты, реализующие пользовательский интерфейс связаны с интерфейсом взаимодействия приложений по НТТР?
Лекция 17. Реализация интерфейса информационного взаимодействия программных приложений.Интерфейс взаимодействия сервера с внешней программой.