【问题标题】:How to get continuous HTTP data?如何获取连续的 HTTP 数据?
【发布时间】:2022-01-08 08:28:31
【问题描述】:

我正在尝试通过 HTTP 从 Internet 获取实时交易数据,但它会不断更新,所以如果我 GET 数据,只要有可用数据,它就会继续下载。在我停止下载流之前,我可以访问数据。

在下载过程中如何访问数据流?

我尝试使用 Indy 的 TIdHTTP,所以我可以使用 SSL,但我尝试了 IdIOHandlerStream,但它已经用于 IdSSLIOHandlerSocketOpenSSL。所以我在这里完全一无所知。

这是对"multipart/form-data" 请求的响应。

请指导我...

Lrequest.Values['__RequestVerificationToken'] := RequestVerificationToken;
Lrequest.Values['acct'] := 'demo';
Lrequest.Values['pwd'] := 'demo';

try    
  Response.Text := Onhttp.Post('https://trading/data', Lrequest);
  Form1.Memo1.Lines.Add(TimeToStr(Time) + ': ' + Response.Text);
except
  on E: Exception do
    Form1.Memo1.Lines.Add(TimeToStr(Time) + ': ' + E.ClassName +
      ' error raised, with message : ' + E.Message);
end;

更新:

数据是一个无穷无尽的 JSON 字符串,像这样:

{"id":"data","val":[{"rc":2,"tpc":"\\RealTime\\Global\\SGDIDR.FX","item":[{"val":{"F009":"10454.90","F011":"-33.1"}}]}]}
{"id":"data","val":[{"rc":2,"tpc":"\\RealTime\\Global\\SGDIDR.FX","item":[{"val":{"F009":"10458.80","F011":"-29.2"}}]}]}

等等,等等……

【问题讨论】:

    标签: http delphi stream multipartform-data indy


    【解决方案1】:

    您不能使用TIdIOHandlerStream 与 TCP 连接进行接口,这不是它的设计目的。它用于使用用户提供的TStream 对象执行 I/O 操作,即用于调试以前捕获的会话。

    TIdHTTP 并非真正设计用于在大多数情况下处理无休止的 HTTP 响应,正如您所描述的。服务器传送其实时数据的确切格式是什么? HTTP 响应标头是什么样的?不知道所使用的确切格式真的很难回答你的问题。

    不过,话虽如此,还是有一些情况需要考虑,具体取决于服务器实际发送的内容:

    • 如果服务器使用基于 MIME 的服务器推送格式,例如 multipart/x-mixed-replace,您可以在 TIdHTTP.HTTPOptions 属性中启用 hoNoReadMultipartMIME 标志,然后在之后自己从 TIdHTTP.IOHandler 读取 MIME 数据TIdHTTP.Get() 退出。例如,您可以使用 TIdMessageDecoderMIME 来帮助您解析 MIME 部分,请参阅 Indy 博客中的 New TIdHTTP hoNoReadMultipartMIME flagDelphi Indy TIdHttp and multipart/x-mixed-replace with Text and jpeg image

    • 否则,如果服务器使用Transfer-Encoding: chunked,每个数据更新都作为一个新的HTTP 块发送,您可以使用TIdHTTP.OnChunkReceived 事件。或者,您可以在TIdHTTP.HTTPOptions 属性中启用hoNoReadChunked 标志,然后在TIdHTTP.Get() 退出后自己从TIdHTTP.IOHandler 中读取块。请参阅 Indy 博客中的 New TIdHTTP flags and OnChunkReceived event

    • 否则,您可以给TIdHTTP.Get() 一个TIdEventStream 写入,然后使用该流的OnWrite 事件来访问原始字节。或者,您可以编写您自己的TStream 派生类来覆盖虚拟Write() 方法。无论哪种方式,您都将负责在将原始正文数据写入流时手动解析和缓冲它们。

    • 否则,您可能不得不求助于TIdTCPClient,手动实现 HTTP 协议,然后您将全权负责根据需要读取 HTTP 响应正文。

    【讨论】:

    • 好的,我会进入领导。和研究。谢谢雷米。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2018-01-31
    • 2015-03-30
    • 2021-11-07
    • 2018-07-03
    相关资源
    最近更新 更多