我使用Indy使用HTTP構建客戶端和服務器應用程序。在客戶端上,我使用TIdHTTP
,並且在我使用TIdHTTPWebBrokerBridge
的服務器上安裝了Web模塊。我需要客戶端能夠通過流將任何類型的數據發佈到服務器。這是通過我稱爲/set?Key=API_KEY&Name=FILE_NAME
的通用命令完成的,其中Key
是用於驗證的API密鑰,而Name
是要發佈的文件的名稱。如何從TIdHTTPWebBrokerBridge中的請求接收二進制數據?
在客戶端,我張貼的數據,像這樣:
function TInnoCloudClient.SetData(const Name: String; AStream: TStream): Bool;
var
U: String;
begin
U:= FServerURL; //Base URL of Server
if Copy(U, Length(U)-1, 1) <> '/' then
U:= U + '/';
U:= U + 'get?Key='+Encode(FAPIKey);
U:= U + '&Name='+Encode(Name);
try
FWeb.Post(U, AStream);
except
on e: exception do begin
//Handle Exception
end;
end;
end;
這個功能應該是內部AStream
將數據保存到一個文件中Name
文件名中的服務器上。然而,在服務器端,在請求處理程序中,我沒有看到Request中的相應TStream
屬性,我可以從中讀取它。
在服務器中,如何獲取我作爲TStream
後代發送的數據?我不需要知道如何保存或處理請求,我該如何從請求中獲取此流(TWebRequest
)?
FYI:https://forums.embarcadero.com/thread.jspa?threadID=64307 – 2013-02-28 18:35:35
從我在Delphi文檔看見什麼我自己的測試似乎要證明這個代碼導致截斷的內容 - 第一個48k(?)將會丟失。在調用'ReadClient'之前,需要讀取'content',它只在'content'的前48k後檢索緩衝區的其餘部分。 – Vector 2016-01-29 21:24:19
我不使用WebBroker,所以我不能說如果這是真的或不。我所知道的是'TIdHTTPWebBrokerBridge'在內部使用'TIdHTTPServer'並向WebBroker公開其功能。如果客戶端發佈數據,則直接從Indy的'TIdHTTPRequestInfo.PostStream'對象讀取各種'TWebRequest.Read ...()'方法,否則它從包含來自'TIdHTTPRequestInfo.FormParams'和'TIdHTTPRequestInfo.UnparsedParams'的數據的'TStringStream'讀取'。所以,如果以我上面顯示的方式閱讀缺少數據,則很可能在運行此代碼之前已經閱讀了它。 – 2016-01-30 00:40:07