Web Broker(Web服务应用程序)入门教程(3)

1. 访问客户端请求信息

当 Web 服务器应用程序接收到 HTTP 请求消息时,客户端请求的头部信息会被加载到一个从 TWebRequest 派生的对象的属性中。例如,在 NSAPI 和 ISAPI 应用程序中,请求消息被封装在一个 Web.Win.IsapiHTTP.TISAPIRequest 对象中,而控制台 CGI 应用程序使用 Web.CGIHTTP.TCGIRequest 对象。

请求对象的属性是只读的。您可以使用它们来收集客户端请求中的所有信息,包括:

1.1 请求头部信息


请求对象中的大多数属性包含来自 HTTP 请求头部的请求信息。并非每个请求都为这些属性中的每一个提供值。此外,随着 HTTP 标准的不断发展,一些请求可能包含未在请求对象属性中显示的头部字段。要获取未作为请求对象属性显示的请求头部字段的值,请使用 GetFieldByName 方法。

请求头部属性可以按功能分类:

1)标识目标的属性


请求消息的完整目标由 URL 属性给出。通常,这是一个可以分解为协议(HTTP)、主机(服务器系统)、ScriptName(服务器应用程序)、PathInfo(主机上的位置)和 Query 的 URL。

这些部分中的每一个都有自己的属性。协议始终是 HTTP,而主机和 ScriptName 标识 Web 服务器应用程序。调度器在匹配动作项到请求消息时使用 PathInfo 部分。Query 由一些请求用来指定请求信息的细节。它的值也被解析为 QueryFields 属性。

2)描述 Web 客户端的属性


请求包括几个属性,提供关于请求来源的信息。这些包括发件人电子邮件地址(From 属性)、消息来源 URI(Referer 或 RemoteHost 属性)。如果请求包含任何内容,并且该内容不来自与请求相同的 URI,则内容的来源由 DerivedFrom 属性给出。您还可以确定客户端的 IP 地址(RemoteAddr 属性)以及发送请求的应用程序的名称和版本(UserAgent 属性)。

3)标识请求目的的属性


Method 属性是一个字符串,描述请求消息要求服务器应用程序执行的操作。HTTP 1.1 标准定义了以下方法:

预定义的标签名称:

值    消息请求的内容
OPTIONS:关于可用通信选项的信息。
GET:由 URL 属性标识的信息。
HEAD:相当于 GET 消息的头部信息,不包括响应内容。
POST:服务器应用程序应将 Content 属性中的数据发布,视情况而定。
PUT:服务器应用程序应将 URL 属性指示的资源替换为 Content 属性中的数据。
DELETE:服务器应用程序应删除或隐藏由 URL 属性标识的资源。
TRACE:服务器应用程序应发送回环以确认收到请求。

Method 属性可能指示 Web 客户端请求服务器的任何其他方法。

Web 服务器应用程序不需要为 Method 的每个可能值提供响应。然而,HTTP 标准确实要求它处理 GET 和 HEAD 请求。

MethodType 属性指示 Method 的值是 GET(mtGet)、HEAD(mtHead)、POST(mtPost)、PUT(mtPut)还是其他字符串(mtAny)。调度器将 MethodType 属性的值与每个动作项的 MethodType 匹配。

4)描述预期响应的属性


Accept 属性指示 Web 客户端将接受作为响应消息内容的媒体类型。IfModifiedSince 属性指定客户端是否只希望获取最近更改的信息。Cookie 属性包括可以修改响应的状态信息(通常由您的应用程序之前添加)。

5)描述内容的属性


大多数请求不包含任何内容,因为它们是请求信息的请求。然而,一些请求,如 POST 请求,提供 Web 服务器应用程序应使用的内容包括。内容的媒体类型在 ContentType 属性中给出,其长度在 ContentLength 属性中给出。如果消息内容被编码(例如,用于数据压缩),这些信息在 ContentEncoding 属性中。产生内容的应用程序的名称和版本号由 ContentVersion 属性指定。Title 属性也可能提供有关内容的信息。

1.2 请求消息的内容


除了头部字段外,一些请求消息还包括 Web 服务器应用程序应以某种方式处理的内容部分。例如,POST 请求可能包括应添加到 Web 服务器应用程序访问的数据库中的信息。

内容的未处理值由 Content 属性给出。如果内容可以解析为由和号(&)分隔的字段,解析版本可在 ContentFields 属性中获得。

2. 创建 HTTP 响应消息


当 Web 服务器应用程序为传入的 HTTP 请求消息创建一个 Web.HTTPApp.TWebRequest 派生对象时,它也会创建一个对应的 TWebResponse 派生对象来表示将返回的响应消息。例如,在 NSAPI 和 ISAPI 应用程序中,响应消息被封装在一个 Web.Win.IsapiHTTP.TISAPIResponse 对象中,而控制台 CGI 应用程序使用 Web.CGIHTTP.TCGIResponse 对象。

生成对 Web 客户端请求的响应的动作项填写响应对象的属性。在某些情况下,这可能简单到只返回一个错误代码或将请求重定向到另一个 URI。在其他情况下,这可能涉及复杂的计算,要求动作项从其他来源获取信息并将其组装成最终形式。大多数请求消息都需要一些响应,即使只是确认已执行请求的操作。

响应 HTTP 请求涉及:


2.1 填写响应头部


Web.HTTPApp.TWebResponse 对象的大多数属性代表发回 Web 客户端的 HTTP 响应消息的头部信息。动作项在其 OnAction 事件处理程序中设置这些属性。

并非每个响应消息都需要为每个头部属性指定一个值。应该设置的属性取决于请求的性质和响应的状态。

使用响应对象属性进行:


1) 指示响应状态


每个响应消息都必须包含一个表示响应状态的状态代码。您可以通过设置 StatusCode 属性来指定状态代码。HTTP 标准定义了许多具有预定义含义的标准状态代码。此外,您可以使用任何未使用的可能值定义自己的状态代码。

每个状态代码是一个三位数,其中最高位数字表示响应类别,如下所示:

(1) 1xx: 信息性(已收到请求但尚未完全处理)。
(2) 2xx: 成功(已收到请求,已被理解并被接受)。
(3) 3xx: 重定向(需要客户端进一步操作以完成请求)。
(4) 4xx: 客户端错误(请求无法理解或无法服务)。
(5) 5xx: 服务器错误(请求有效但服务器无法处理)。

与每个状态代码相关联的是一个解释状态代码含义的字符串。这由 ReasonString 属性给出。对于预定义的状态代码,您不需要设置 ReasonString 属性。如果您定义了自己的状态代码,您也应该设置 ReasonString 属性。

2) 指示需要客户端操作


当状态代码在 300-399 范围内时,客户端必须执行进一步操作,Web 服务器应用程序才能完成其请求。如果您需要将客户端重定向到另一个 URI,或指示已创建一个新的 URI 来处理请求,请设置 Location 属性。如果客户端必须提供密码才能继续,请设置 WWWAuthenticate 属性。

3) 描述服务器应用程序
一些响应头部属性描述了 Web 服务器应用程序的能力。Allow 属性指示应用程序可以响应的方法。Server 属性给出用于生成响应的应用程序的名称和版本号。Cookies 属性可以保存有关客户端使用服务器应用程序的状态信息,这些信息包含在后续的请求消息中。

4) 描述内容


几个属性描述了响应的内容。ContentType 给出响应的媒体类型,ContentVersion 是该媒体类型的版本号。ContentLength 给出响应的长度。如果内容被编码(例如,用于数据压缩),请用 ContentEncoding 属性表示。如果内容来自另一个 URI,则应在 DerivedFrom 属性中表示。如果内容的值是时间敏感的,LastModified 属性和 Expires 属性指示该值是否仍然有效。Title 属性可以提供有关内容的描述性信息。

2.2 设置响应内容


对于一些请求,响应消息的内容完全包含在响应的头部属性中。然而,在大多数情况下,动作项会为响应消息分配一些内容。这些内容可能是存储在文件中的静态信息,或者是动作项或其内容生成器动态产生的信息。

您可以使用 Content 属性或 ContentStream 属性来设置响应消息的内容。

Content 属性是一个字符串。Delphi 字符串不仅限于文本值,因此 Content 属性的值可以是 HTML 命令字符串、图形内容(如位流)或任何其他 MIME 内容类型。

如果响应消息的内容可以从流中读取,请使用 ContentStream 属性。例如,如果响应消息应该发送文件的内容,请为 ContentStream 属性使用 System.Classes.TFileStream 对象。与 Content 属性一样,ContentStream 可以提供 HTML 命令字符串或其他 MIME 内容类型。如果您使用 ContentStream 属性,请自行不要释放流。Web 响应对象将自动为您释放。

注意:如果 ContentStream 属性的值不为 nil,则忽略 Content 属性。

2.3 发送响应


如果您确定对请求消息没有更多的工作要做,您可以直接从一个 Web.HTTPApp.TWebActionItem.OnAction 事件处理程序发送响应。响应对象提供了两种发送响应的方法:SendResponse 和 SendRedirect。调用 SendResponse 使用 TWebResponse 对象的指定内容和所有头部属性发送响应。如果您只需要将 Web 客户端重定向到另一个 URI,SendRedirect 方法更有效。

如果没有任何事件处理程序发送响应,Web 应用程序对象在调度器完成后会发送它。然而,如果没有任何一个动作项表示它们已经处理了响应,应用程序将关闭与 Web 客户端的连接,而不发送任何响应。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caridle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值