【问题标题】:Delphi - Using Indy HTTP Client to send a response back to a serverDelphi - 使用 Indy HTTP 客户端将响应发送回服务器
【发布时间】:2011-01-30 12:48:41
【问题描述】:

我正在使用 Indy idHTTP 对象从服务器请求 XML 数据。发出请求后,服务器会发送回复,我可以读取回复标头 OK: 结果 := IdHTTP1.Response.ResponseText;

然后他们的系统会继续定期发送未经请求的 XML 数据,直到预定的超时期限到期。

但是,客户现在希望我的客户端应用程序在我每次接收数据时向他们发送一个 HTTP 响应(响应基于成功解析 XML)。

如果我是服务器,我可以计算出如何发送响应,但是如何生成响应标头并使用我的 idHTTP1 客户端仅发布(或放置、发送等)标头。

我认为这在 RFC 2616 中没有完全定义,因为服务器通常发送 HTTP 响应,而不是客户端,即:

6 响应

"服务器收到并解释请求消息后响应 带有 HTTP 响应消息。”

我以为我可以使用 TIdHTTPResponseInfo 并使用 WriteHeader 方法,但如果我是客户端,我不知道如何设置与我需要回复的 URL 的链接。

我正在使用 Delphi XE 和 Indy 10.5.7

我尝试了很多方法,但都没有成功。

非常感谢任何帮助或可能的代码示例!

【问题讨论】:

  • TIdHttp 是 CLIENT HTTP 组件,它相当于一个 Web 浏览器。怎么会有人给你发unsolicited XML data at regular intervals until a predetermined timeout period expires?这就像说:After doing this Google search, I keep getting new web pages in my browser until a predefined time expires.
  • @Cosmin 重新阅读 RFC 2616。这是可能的。
  • 是的,完全正确。除了他们的系统发送 XML 数据而不是网页。实际上我们可以看到没有任何问题。未经请求的数据接收部分工作正常。这根本不是问题,而是如何将 HTTP 响应发回给他们,这是我们需要解决的问题。
  • +1 用于查看规格! @Cosmin Prund:这就是 HTTP/1.1“保持活动”连接。让我猜猜,一些 XML-RPC 的 PHP 实现 [错误] 表现得这样?

标签: delphi indy


【解决方案1】:

您的问题可以分为两部分:(a)我必须向服务器发送哪些数据以通知服务器,以及(b)我如何使用 IdHTTP 发送这些数据。

虽然在连接关闭之前发送数据流符合 HTTP 标准,但 HTTP 是一种请求-响应协议。如果客户端接收到数据作为响应,那么它就不能用自己的响应来回复——客户端只能发送另一个请求。所以你的任务是弄清楚服务器会接受什么样的请求作为数据接收的确认。一旦你明白了这一点,你将能够找到如何(如果)使用 IdHTTP。

更新:如果您应该向服务器发送 200 OK ,那么这不符合 HTTP 协议规范。您可以尝试访问 HTTP 客户端后面的套接字并发送 7 个字节(200 OK + CRLF)。

【讨论】:

  • 谢谢,对于 (a) 部分,我可以弄清楚要寄回什么。例如200 OK 或 400 错误。我需要知道答案的是你的(b)。您是否建议我可能会提出进一步的请求,但以某种方式仅包含 HTTP 标头,以便“欺骗”它实际收到响应的服务器?
  • 谢谢 Eugene,那不需要是 'HTTP/1.1 200 OK CrLf'(18 字节)还是我不需要 HTTP 版本信息? (来自 RFC 2616, 6.1: '6.1 Status-Line 响应消息的第一行是状态行,由协议版本和数字状态代码及其相关的文本短语组成,每个元素由 SP 字符分隔。除了最后的 CRLF 序列,不允许 CR 或 LF。Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF'
  • @James 因为无论如何这都不符合标准,所以您需要向服务器开发人员提出一个问题。他们可能期望或接受他们想象的任何东西。我的话大约 7 个字节只是根据您之前的评论的猜测。
【解决方案2】:

如果服务器希望客户端发送对每个 XML 回复的确认,则服务器没有实现实际的 HTTP 协议,因为这是不允许的行为。更有可能的是,他们正在实现自己的自定义协议,模仿但不是 HTTP。例如,SIP 有许多与 HTTP 相似的特性,也有许多不相似的特性(例如,对单个请求的多次回复)。

您需要找出服务器真正实现的协议类型。您将无法使用TIdHTTP。直接使用TIdTCPClient。然后,您可以根据需要发送和接收数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多