我使用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