程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> 編碼-如何使用 Delphi RestClient 讀取流數據?

編碼-如何使用 Delphi RestClient 讀取流數據?

編輯:編程解疑
如何使用 Delphi RestClient 讀取流數據?

OANDA網站提供的REST API可以讀取賬戶信息("https://api-fxtrade.oanda.com/v1/accounts),以及提供流報價(streaming,比如"https://stream-fxtrade.oanda.com/v1/prices?accountId=12345&instruments=AUD_CAD%2CAUD_CHF" )。

目前在XE7版本,使用Delphi提供的RestClient組件可以實現讀取賬戶信息。但是,對於服務端的流數據,由於其傳輸方式是 chunked transfer encoding,按照賬戶數據讀取方式則會在停在最後Excute無法獲得返回的Json字符串。

代碼如下:

 function GetStreamingPrices:TQJson 
var 
  ....
begin
      Result := TQJson.Create;
            // Get
     _RESTRequest.Method := rmGET;
        //指定資源位置:'/prices'
     _RESTRequest.Resource := TRequestSourceURITemplate.Prices;
         //生成query串:accountId=12345&instruments=AUD_CAD%2CAUD_CHF 
     _RESTRequest.AddParameter(TQueryPairKey.AccountID,accountlist[0],pkGETorPOST);
     _RESTRequest.AddParameter(TQueryPairKey.Instruments,'EUR_USD',pkGETorPOST);
         //URL 
     ._RestClient.BaseURL := 'https://stream-fxtrade.oanda.com/v1';
        //執行
     _RestRequest.Execute;
        //解析為Json
     Result.tryParse(_RESTResponse);
end;

so,請教,如何使用Delphi XE7 的RestClient 獲取 chunked transfer encoding 的流數據?請不吝賜教。


多謝一樓 @caozhy 提供的信息,不過沒有沒有解決此問題。我再描述一下:
1、上面的代碼用於正常的request-response過程,是沒有問題的。
2、 問題出在,報價流的獲取上。報價服務器在工作時段實際是持續傳輸,一直沒有結束,采取chunked transfer encoding模式持續地向外傳輸當時的即時價格信息。使用上面代碼,就會處在一直等待狀態下。

因此,需要達到的目標就是:一,不能等到結束標志才去解析收到的字符串。二,即便間歇獲取數據,如果中間的緩沖時間過長,也不能忍受。

最佳回答:


用TIdeventstream方法效率更高:

ResponseEventStrem:TIdEventStream;

ResponseEventStrem.OnWrite := IdEventStreamWrite;

//這個自定義的過程替代了stream的write函數。
procedure  TRatesStreamWorker.IdEventStreamWrite(const ABuffer: TIdBytes; AOffset: Integer; ACount: Integer; var VResult: Integer);

var
AJson : TQJson;
begin
AJson := TQJson.Create;
AJson.TryParse(BytesToString(ABuffer,Aoffset,ACount,enUTF8)); //buffer是收到的http的content
if AJson.Count >0 then Jsons.Add(AJson);
VResult := ACount; //已經寫入流的字節數,這裡直接返回為count
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved