На этом шаге мы рассмотрим ответ приложения Web-сервера клиенту.
Для представления запроса клиента к Web-серверу применяется объект TWebRequest, а для ответа Web-сервера существует объект TWebResponse.
Этот объект создается Web-приложением вместе с объектом TWebRequest после получения HTTP-запроса. Для приложений ISAPI и NSAPI это будет объект TISAPIResponse, а для приложений CGI и WinCGI, объекты TCGIResponse и TWinCGIResponse соответственно. В ходе своей работы Web-приложение должно заполнить свойства, соответствующие заголовочной информации, и данными самого сообщения и отослать ответ клиенту. Заполнением свойств объекта-ответа занимаются объекты-действия из обработчиков событий OnActiоn. Иногда они выполняют самые простые действия, например, возвращают клиенту код ошибки. Иногда - выполняют сложные вычисления над данными, полученными из нескольких источников.
Свойства, посвященные заголовочной информации, можно разделить на несколько групп. Не все эти свойства обязательно заполняются. Все зависит от типа запроса и характера ответа. Итак, четыре группы:
В первую группу входят свойства StatusCode и ReasonString. Каждый ответ должен содержать в свойстве StatusCode числовой код состояния ответа. Это число из трех цифр. Для этих кодов существует предопределенный набор значений. Хотя приложении можно использовать не занятые значения для своих собственных кодов. Условно эти трехцифровые коды состояния делятся на пять групп по значению первой цифры:
Поясняет числовой код состояния значение строкового свойства ReasonString. Для предопределенных значений кодов нет необходимости заполнять это свойство. Но если вводить новые (собственные) коды состояния, то для них придется это свойство заполнять некоторым текстовым пояснением.
Когда приложение выставляет статус состояния 3хх, это значит, что для продолжения обработки запроса требуется вмешательство клиента. Если для выполнения запроса его нужно перенаправить на другой URI, то этот ресурс указывается в свойстве Location. Если для продолжения работы требуется ввести пароль, то в этом случае используется свойство WWWAuthehticate.
В свойстве Allow перечисляются методы, которые может выполнять серверное приложение. В свойство Server записывается имя и номер версии серверного приложения. В свойстве Cookies перечисляются поля Cookies, которые должны отсылаться с ответом.
Само содержимое ответа заносится в свойство Content или ContentStream. Первое свойство строкового типа, но может содержать в себе кроме текста и тегов HTML двоичные данные, например, графическую информацию или данные в стандарте MIME. Второе свойство удобно использовать, если данные для ответа нужно извлекать из потока, например, из файла. Если свойство ContentStream заполнено, то содержимое свойства Content игнорируется.
Далее в свойстве ContentType указывается тип данных, помещаемых в ответ, в свойстве ContentVersion указывается версия используемого формата данных. Например, если тип содержимого text/html, то в ContentVersion указывается версия языка HTML. Размер ответа в байтах помещается в свойство ContentLength. Если содержимое запроса кодировалось, то использованные для этого методы перечисляются через запятую в свойстве ContentEncoding. Если ответ получен от другого URI, то в свойстве DerivedFrom записывается URI источника, создавшего содержимое ответа.
В случае, если содержимое ответа чувствительно ко времени, имеются два свойства LastModified и Expires. В первом помещается время и дата последнего обновления свойства Content, во втором - дата и время "окончания срока годности" ответа. В свойстве Title может содержаться некоторая заголовочная информация.
На следующем шаге мы рассмотрим отправку ответа клиенту.