通过分块的传输编码发送 HTTP 请求或响应

您可以将 CICS® 作为 HTTP 客户机为 HTTP 请求设置分块的传输编码,或者将来自 CICS 的 HTTP 响应设置为 HTTP 服务器。

开始之前

首先,请考虑要发送的项的以下属性:
  • 应该在消息开头使用的 HTTP 头。 CICS 提供了其通常的消息头,这些消息头在 CICS Web Support 的 HTTP 头参考 中列出。 对于分块传输的消息, CICS 会提供适当的分块传输编码头,包括传输编码:分块传输头。 如果消息开头需要任何其他头,那么应用程序可以在进行第一个 WEB SEND 命令前编写它们。
  • 消息末尾的应该在尾部发送的任何头。 这些头称为尾部头。 HTTP/1.1 规范设置使用尾部头的要求,即使接收方忽略它们也没有关系。
  • 将如何分割消息。 可以用对应用程序来说最方便的任何方式来分割消息。 例如,来自许多其他应用程序的输出可以用它所产生的方式发送,或者,可以单独读取和发送表的每一行的数据。
  • 将发送的每个数据块的长度。 不要包含任何尾部头的长度。

关于此任务

使用此过程创建正确构造的分块消息,如 HTTP/1.1 规范中定义的。 请参阅 HTTP 协议 以获取更多信息。 如果未正确构造分块消息,那么接收方可能丢弃它。

将来自 CICS 的 HTTP 响应作为 HTTP 服务器 发送是一组主要指示信息,用于编写应用程序以发送服务器响应。 通过 CICS 作为 HTTP 客户机 发出 HTTP 请求是编写应用程序以发出客户机请求的主要指示信息集。 您可以将当前主题中的指示信息与这两个指示信息集合中的任一个结合使用。

无法直接从 CICS 文档构成分块消息的主体,因此无法使用 DOCTOKEN 选项。 必须使用 FROM 选项指定数据以形成分块的消息体。

已开始发送部分分块的消息后,直到发送最后一个空块并完成分块的消息后,您才能发送其他消息或接收项。

过程

  1. 开始分块的消息前,请验证 Web 客户机或服务器是否为 HTTP/1.1 版本。
    所有 HTTP/1.1 应用程序都必须处理分块的传输编码。 分块的消息不能被发送到 HTTP/1.0 接收方。
    1. 对于 CICS 作为 HTTP 服务器发送的响应,请使用 WEB EXTRACT 命令来检查为 Web 客户机请求指定的 HTTP 版本。
    2. 对于 CICS 作为 HTTP 客户机发送的请求,如果在命令上指定 HTTPVNUM 和 HTTPRNUM 选项,那么将在连接的 WEB OPEN 命令上返回服务器的 HTTP 版本。 如果未指定这些选项,那么使用 WEB EXTRACT 命令来检查服务器的 HTTP 版本。
    3. 或者,您可以在发出 WEB SEND 命令来发送消息的第一个块时,省略这项检查,并让 CICS 检查 Web 客户机或服务器的版本。
      如果接收方是 HTTP/1.0,您将接收到错误响应。
  2. 根据需要多次使用 WRITE HTTPHEADER 命令来编写必须在消息主体 之前 发送的任何 HTTP 头。
    请勿为分块的传输编码编写头; CICS 使用应用程序提供的区块长度信息来写入头本身。
  3. 如果要将尾部头 (消息主体 之后 发送的头) 与分块消息一起包含,请使用 WRITE HTTPHEADER 命令来编写 Trailer 头。 将您打算在尾部中发送的所有 HTTP 头的名称指定为尾部头的值。
    除了 Transfer-Encoding、Trailer 和 Content-Length 头,您可以发送任何头作为尾部头。
    1. 对于 CICS 作为 HTTP 服务器发送的响应,请确保 Web 客户机在其请求中发送了 TE: 尾部头。
      该头表示客户机能够处理尾部头。
      如果您尝试在客户机未发送 TE: 尾部时写入 Trailer 头,那么 CICS 会将 RESP2 值为 6 的 INVREQ 响应返回到 WRITE HTTPHEADER 命令。 或者,您可使用 READ HTTPHEADER 命令检查是否存在 TE: 尾部头。
    2. 对于 CICS 作为 HTTP 客户机发送的请求,可以包含尾部头,而无需引用 TE 头。
    在分块的发送过程期间,写尾部头本身。
  4. 使用 WEB SEND 命令发送消息的第一个块。
    1. 指定 CHUNKING (CHUNKYES) 以告知 CICS 它是消息的块。
    2. 使用 FROM 选项指定来自消息体的第一块数据。
    3. 使用 FROMLENGTH 选项指定块的长度。
    4. 对于 CICS 作为 HTTP 客户机发出的请求,请在 METHOD 选项上指定相应的方法。 分块的传输编码与没有消息体的请求无关,因此它与 GET、HEAD、DELETE、OPTIONS 和 TRACE 方法无关,但是它可以用于 POST 和 PUT 方法。
    5. 指定应用到分块和非分块消息的任何其他选项,如您的主要指示信息集合中所提供。
  5. 必要的话,多次使用 WEB SEND 命令以发送每个剩余消息块。 在每个 WEB SEND 命令中,指定以下项:
    1. CHUNKING(CHUNKYES)
    2. FROM,它给定数据块
    3. FROMLENGTH,它给定块的长度
    不要为该命令指定任何其他选项。 CICS 在您发出命令时发送每个区块。
  6. 可选: 在对第一个区块发出 WEB SEND 命令之后的任何时候,但在对最后一个空区块发出 WEB SEND 命令之前 (请参阅下一步) ,使用 WRITE HTTPHEADER 命令来创建作为尾部头发送的更多 HTTP 头。
    如果在消息的第一个块上写入了 Trailer 头,那么在分块发送过程中写入的 HTTP 头将被 CICS 视为尾部头,并随最终空块一起发送。 (如果未写入 Trailer 头,那么 CICS 不允许写入任何尾部头。)
    请注意, CICS 不会检查您的尾部头是否与您在消息的第一个块上的初始 Trailer 头中指定的名称匹配。
  7. 当已发送最后一个数据块时,再指定一个带 CHUNKING(CHUNKEND) 但不带 FROM 或 FROMLENGTH 选项的 WEB SEND 命令。
    然后, CICS 生成空块并将其发送给收件人以结束分块的消息。 空块与包含您所写的任何尾部头的尾部一起发送。
  8. 对于作为 HTTP 服务器的 CICS ,将按如下所示处理错误:
    1. 如果序列中的某个 WEB SEND 命令失败,那么返回错误响应并且以后的发送也将失败。 应用程序必须对这种情况进行相应的处理。
    2. 如果成功发送所有块,但应用程序未发出带 CHUNKING(CHUNKEND) 的最终 WEB SEND 命令,那么异常终止事务,且带有异常终止代码 AWBP。
      此异常终止是必需的,因为 CICS 无法保证分块的消息完整且正确,因此无法代表应用程序发出最终空块。
    接收方忽略了不完整的分块消息并将其丢弃。 Web 客户机会确定是否再次尝试该请求。
  9. 对于作为 HTTP 客户机的 CICS ,将按如下所示处理错误:
    1. 如果您的应用程序在已分块 transfer-coding 过程的任何时候获知到错误,那么使用 WEB CLOSE 命令停止该过程并关闭连接。
      服务器不会接收最终的空块,因此会忽略和丢弃迄今为止您已发送的数据。 您可以决定是否重试请求。
    2. 如果未发送最终空块或发出 WEB CLOSE 命令,那么将在任务终止时向 CWBO ( CICS Web Support 消息的瞬时数据队列) 写入一条警告消息。
      服务器接收超时且忽略和丢弃了所发送的数据。