我正在使用Indy使用HTTP构建客户端和服务器应用程序。在客户端上,我正在使用TIdHTTP
并且在服务器上我使用TIdHTTPWebBrokerBridge
和Web模块。我需要客户端能够通过Stream将任何类型的数据发布到服务器。这是通过我称为/set?Key=API_KEY&Name=FILE_NAME
的通用命令完成的,其中Key
是用于身份验证的API密钥,Name
是要发布的文件的名称。
在客户端上,我发布的数据如下:
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
。但是,在服务器端,在请求处理程序中,我在请求中看不到相应的TStream
属性,我可以从中读取此属性。
在服务器中,如何获取作为TStream
后代发送的数据?我不需要知道如何保存或处理请求,我如何从请求中获取此流(TWebRequest
)?
答案 0 :(得分:4)
使用TWebRequest.ReadClient()
或TWebClient.ReadString()
方法阅读发布的二进制数据,或使用TWebRequest.RawContent
属性将发布的数据检索为AnsiString
。
这样的事情应该有效:
procedure TWebModule1.GetAllDataAsStream(ARequest: TWebRequest; AStream: TMemoryStream);
var
BytesRead, ContentLength: Integer;
Buffer: array[0..1023] of Byte;
begin
AStream.Clear;
ContentLength := ARequest.ContentLength;
while ContentLength > 0 do begin
BytesRead := ARequest.ReadClient(Buffer[0], Min(ContentLength, SizeOf(Buffer)));
if BytesRead < 1 then Break;
AStream.WriteBuffer(Buffer[0], BytesRead);
Dec(ContentLength, BytesRead);
end;
AStream.Position:= 0;
end;