如何使用Indy TIdTCPClient实例从Web服务器(包括响应主体)检索完整的HTTP响应?

时间:2012-06-03 00:06:39

标签: delphi http sockets indy rfc

我有一个Delphi 6应用程序,它使用Indy TIdTCPClient 实例与Web服务器通信。我之间没有直接使用HTTP客户端的原因是因为服务器是一个图像流服务器,它使用相同的套接字连接来接收启动流的命令,就像它开始“推送”图像一样给你。换句话说,在您发送典型的HTTP POST请求后,它会回复HTTP响应,然后立即开始发送JPEG图像流。

我已经知道如何制作正确的POST请求并使用TIdTCPClient WriteBuffer()方法发送它,然后使用 ReadBuffer()方法接收回复数据。我想要做的是发送一个POST请求,然后让Indy等待典型的HTTP响应,包括检索响应正文中的所有字节,如果有 Content-Length 标头变量。我当然希望它保持JPEG帧完好无损,可能在接收队列中的HTTP响应之后堆积,直到我开始请求它们(也就是说,我不希望它包括HTTP响应中的任何JPEG帧)我的流请求命令,直到我使用连续的读取呼叫请求它们。)

我是否可以在TIdTCPClient上调用一个方法,该方法将完全检索具有正文内容的典型HTTP响应,而不是其他内容?我考虑过使用 SendCmd()并检查 LastCmdResult 属性(类型: TIdRFCReply )作为响应,但我无法从如果在返回的响应中有一个 Content-Length 标头变量,它也会检索响应主体内容的Indy文档,也不能判断它是否在响应之后离开接收队列的其余部分完好。

与HTTP Web服务器完成此混合模式交互的最佳方法是什么?在您发出HTTP请求以开始流式传输之后立即推出JPEG帧流?

此外,如果有一种聪明的方法让Indy使用JPEG帧WINBONDBOUDARY分隔字符串来分割帧,而不是累积数据块并自己解析它们,请分享该技术。

1 个答案:

答案 0 :(得分:2)

正确读取HTTP响应的方法是首先逐行读取CRLF分隔的响应标头,直到遇到空白行,即CRLF + CRLF序列,然后就可以了使用这些标头来决定如何读取剩余的响应数据。标头不仅会告诉您(通过Content-Type标头)发送的是哪种流,还会告诉您数据的框架方式(Content-LengthTransfer-Encoding: chunked,特定于特别是Content-Type等。)

要接收标题,您可以使用连接的Capture()方法,将其ADelim参数设置为空字符串。

之后如何读取剩余数据取决于流的实际格式/框架。如果不确切知道您接收的是哪种流,则无法建议您如何最好地阅读它,因为HTTP服务器使用了几种不同类型的流协议,而且大多数都没有标准化。提供这些信息,然后我/我们可以向您展示如何使用Indy实现它。

您不能使用SendCmd(),因为HTTP协议不会以与该方法兼容的方式格式化其响应。

相关问题