delphi 将文件作为字节数组发送到 Rest 服务

Ene*_*ğlu 3 arrays delphi rest delphi-10.1-berlin

我正在使用 Delphi 10.1 Berlin

我想使用 将图像数据发送TBytes到 Rest 服务TRestRequest,但我找不到将 a 传递TBytes给该TRestRequest.AddBody()方法或任何其他方法的方法。

POST http://myserver:1111//Openxxx/RecxxxLxxxPxxxx HTTP/1.1
内容类型:文本/json
主机:myserver:1111
内容长度:28892
期望:100-继续
连接:保持活动

[255,216,255,224,0,16,74,70,73,70,0,1,1,0,0,1,0,1,0,0,255,219,0,132,0,9,
...
...
...
130,130,252,168,127,164,63,164,41,109,204,245,62,106,51,135,12,146,63,255,217]

Rem*_*eau 5

TRESTRequest.AddBody()有一个接受 aTStream作为输入的重载。您可以使用类将您的包装TBytes成一个。TStreamTBytesStream

procedure TForm1.Button1Click(Sender: TObject);
var
  ABytes: TBytes;
  AStream: TBytesStream;
begin
  ABytes := ...;
  try
    AStream := TBytesStream.Create(ABytes);
    RESTRequest1.AddBody(AStream, ctIMAGE_JPEG); 
    RESTRequest1.Execute;
  finally
    AStream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

或者,TRESTRequestParameterList.AddItem改用它,它具有以下重载TBytes

procedure TForm1.Button1Click(Sender: TObject);
var
  ABytes: TBytes;
begin
  ABytes := ...
  RESTRequest1.Params.AddItem('body', ABytes, pkGETorPOST, [poDoNotEncode], ctIMAGE_JPEG);
  RESTRequest1.Execute;
end;
Run Code Online (Sandbox Code Playgroud)

话虽如此,我发现TRESTClient它过于复杂和错误/限制。更多时候,Indy'sTIdHTTP更容易使用,例如:

procedure TForm1.Button1Click(Sender: TObject);
var
  ABytes: TBytes;
  AStream: TBytesStream;
begin
  ABytes := ...;
  try
    AStream := TBytesStream.Create(ABytes);
    IdHTTP1.Request.ContentType := 'image/jpeg';
    IdHTTP1.Post('http://myserver:1111//Openxxx/RecxxxLxxxPxxxx', AStream);
  finally
    AStream.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdHTTP1.Request.ContentType := 'image/jpeg';
  IdHTTP1.Post('http://myserver:1111//Openxxx/RecxxxLxxxPxxxx', 'image.jpg');
end;
Run Code Online (Sandbox Code Playgroud)