为响应编写 HTTP 头

对于应用程序创建的动态响应, CICS® 根据用于消息的 HTTP 协议版本,自动提供基本消息所需的 HTTP 头。 您的应用程序不需要写这些头。 但是,您可能想要将更多 HTTP 头添加到您的响应。

关于此任务

以下是 CICS 创建的头的完整列表:
  • ARM 相关因子
  • 连接
  • Content-Type(由 CICS 编写,但在需要复杂头时,可由客户机应用程序提供)
  • Content-Length
  • Date
  • Expect
  • 主机
  • 服务器 (自动创建取决于系统初始化参数 HTTPSERVERHDR
  • TE(由 CICS 编写,但是可能添加了更多实例)
  • Transfer-Encoding
  • User-Agent (自动创建取决于系统初始化参数 HTTPUSRAGENTHDR
  • WWW-Authenticate

请注意,仅当 CICS 是 HTTP 客户机时,这些头中的某些头才适用和创建。 CICS Web Support 的 HTTP 头参考 中描述了创建这些头的环境。 如果在响应上写入这些头,那么 CICS 不会覆盖这些头,而是使用应用程序提供的版本。

CICS 在发送响应时提供的头通常是为了使基本消息符合相应的 HTTP 协议规范而编写的头。 您可能想要将更多的 HTTP 头添加到响应中以实现以下这些目的:
  • 控制高速缓存和文档到期;例如,Cache-Control、Expires 和 Last-Modified。
  • 内容协商;例如,Accept-Ranges 和 Vary。
  • Web 客户机的信息;例如,Title、Warning 和更多 Content 头。

如果您的应用程序正在执行复杂操作,或者如果为您的响应选择某些状态码,那么您所遵从的 HTTP 规范可能要求将特定的 HTTP 头用于您的消息。 当将任何 HTTP 头添加到响应时,检查一些重要需求所遵从的 HTTP 规范是否应用于那些头。 请参阅 HTTP 协议 ,以获取有关 HTTP 规范的更多信息。

注: 如果 HTTP 头包含标准字母和数字字符以外的字符,那么必须在代码页 037 中提供该头。

在您发出 WEB SEND 命令以发生消息,为消息编写其他 HTTP 头。 该规则的例外情况是在您编写的头要在已分块消息上作为尾部头发送时,在这种情况下,随后的过程适用。 要为响应编写 HTTP 头:

过程

  • 对要添加到消息的每个头使用 WEB WRITE HTTPHEADER 命令。
    确保以您正在遵从的 HTTP 规范所描述的格式为每个头指定名称和值。 CICS 不会验证 HTTP 头的内容,这是因为您可能希望使用新的或用户定义的头。
    该命令添加单个头,您可以重复该命令以添加更多头。 如果您编写已编写的头,那么除了现有头外, CICS 还会将新头添加到请求或响应。 仅当 HTTP 规范规定可以重复头时,才重新编写头。
    CICS 存储发送请求时准备添加到请求的头。
  • 如果您使用的任何 HTTP 头可能不适合低于 HTTP/1.1 级别的 Web 客户机,那么写那些头前,请检查 Web 客户机已提供给您的 HTTP 版本信息。
    使用 WEB EXTRACT 命令获取此信息。
    为了允许您使用用户定义的 (非标准) 头, CICS 不会除去不适合的用户编写的头。 低于 HTTP/1.1 级别的服务器无法识别某些 HTTP 头,这可能导致处理您的请求时出错。

    对于低于 HTTP/1.0 级别的服务器或 Web 客户机, CICS 不会进行任何特殊配置。 CICS 的行为与它们处于 HTTP/1.0 级别一样,并返回 HTTP/1.0 作为 HTTP 版本。

  • 如果要生成用于某个 HTTP 头 (例如, Last-Modified 头) 的日期和时间戳记,请使用 FORMATTIME 命令。
    命令中的 STRINGFORMAT 选项用于将当前日期和时间(ABSTIME 格式)或应用程序生成的日期和时间转换为适合在 Web 上使用的日期和时间戳记格式。 某些与 CICS 通信的 Web 客户机或服务器可能不接受其他日期和时间戳记格式。
  • 如果要生成强实体标记以在 ETag HTTP 头中使用,那么可以使用由 BIF DIGEST 命令生成的 SHA-1 摘要。
    通过强实体标记,客户机能够针对在 If-Match、If-None-Match 或 If-Range 头中使用实体标记的资源发出条件请求,与 Last-Modified 日期和时间字符串相比,这是一种更为准确的资源状态检查方法。 如果希望允许条件请求,那么应用程序必须为这些请求提供支持;CICS 自身没有为针对 HTTP GET 请求的 If-Match、If-None-Match 或 If-Range 函数提供支持。
  • 如果要使用分块的传输编码来发送 HTTP 请求或响应,并且要在分块的消息末尾包含尾部头,请遵循 使用分块的传输编码发送 HTTP 请求或响应中的特殊指示信息。
    在发送消息的第一块前,需要编写 Trailer 头。 继 WEB SEND 命令后为第一块写的所有 HTTP 头作为尾部头来对待。
  • 确保您的应用程序执行用户所写的头暗示的任何操作。
    例如,如果您已编写内容协商头,那么您的应用程序必须提供不同版本的资源。