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

Arrays delphi将文件作为字节数组发送到Rest服务,arrays,rest,delphi,delphi-10.1-berlin,Arrays,Rest,Delphi,Delphi 10.1 Berlin,我正在使用Delphi10.1 我想使用TRestRequest将图像数据作为TBytes发送到Rest服务,但找不到方法将TBytes传递到TRestRequest.AddBody()方法或任何其他方法 POST http://myserver:1111//Openxxx/RecxxxLxxxPxxxx HTTP/1.1 Content-Type: text/json Host: myserver:1111 Content-Length: 28892 Expect: 100-continue

我正在使用Delphi10.1

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

POST http://myserver:1111//Openxxx/RecxxxLxxxPxxxx HTTP/1.1 Content-Type: text/json Host: myserver:1111 Content-Length: 28892 Expect: 100-continue Connection: Keep-Alive [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] 邮递http://myserver:1111//Openxxx/RecxxxLxxxPxxxx HTTP/1.1 内容类型:text/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] 具有接受
TStream
作为输入的重载。您可以使用类将
t字节
包装成
TStream

或者,改为使用,它具有
t字节的重载:

procedure TForm1.Button1Click(Sender: TObject);
var
  ABytes: TBytes;
begin
  ABytes := ...
  RESTRequest1.Params.AddItem('body', ABytes, pkGETorPOST, [poDoNotEncode], ctIMAGE_JPEG);
  RESTRequest1.Execute;
end;
话虽如此,我发现
TRESTClient
过于复杂,存在缺陷/限制。很多时候,Indy的
TIdHTTP
更易于使用,例如:

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;


我已经解决了我的问题,如下所示:

function BytesToStr(abytes: tbytes): string;
var
  abyte: byte;
begin
   for abyte in abytes do
   begin
      Result := result + IntToStr(abyte) + ',';
   end;
   Result := '[' + Copy(Result, 1, Length(Result) - 1) + ']';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   ABytes: TBytes;
begin
   ABytes := TFile.ReadAllBytes('images.jpg');
   RESTRequest1.Params.AddItem('body', BytesToStr(ABytes), pkREQUESTBODY, [], ctAPPLICATION_JSON);
   RESTRequest1.Execute;
end;

将其编码为Base64,这样传递一个字符串不是更简单吗?。我试图调用一个现有的Web服务,它被其他人使用(用C#编写),我像下面那样尝试过,但没有改变<代码>代码
var ABytes:TBytes;AStream:tbytestream;begin ABytes:=TFile.ReadAllBytes('images.jpg');AStream:=TBytesStream.Create(ABytes);RESTRequest1.ClearBody;RESTRequest1.AddBody(AStream);//ByteArrayToString(ABytes));RESTRequest1.执行;结束<代码>代码它会创建一条类似于:
POST的消息http://s-lywms:2364//OpenAlpr/RecognizeLicensePlates HTTP/1.1内容类型:application/x-www-form-urlencoded-Accept:application/json,text/plain;q=0.9,文本/html;q=0.8,接受字符集:UTF-8,*;q=0.8用户代理:Embarcadero RESTClient/1.0连接:保持活动内容长度:0主机:s-lywms:2364
如果不深入了解REST客户端的源代码,我无法回答这个问题。但是为什么要将文件读入
t字节
,而不是直接使用
t文件流
<代码>var AStream:TFileStream;开始AStream:=TFileStream.Create('images.jpg',fmOpenRead);RESTRequest1.ClearBody;RESTRequest1.AddBody(AStream);RESTRequest1.执行;AStream.Free;结束Hi Remmy首先我想感谢您,但您的解决方案创建了一个空的REST请求。没有人体数据。我想提醒一下,我不是这个服务的供应商/提供者,我正在尝试编写我的客户机和提供者等待一个字节数组(我想它的意思是TBytes)<代码>邮政http://s-lywms:2364//OpenAlpr/RecognizeLicensePlates HTTP/1.1内容类型:application/x-www-form-urlencoded-Accept:application/json,text/plain;q=0.9,文本/html;q=0.8,接受字符集:UTF-8,*;q=0.8用户代理:Embarcadero RESTClient/1.0连接:保持活动内容长度:0主机:s-lywms:2364@RemyLebeau如何使用RESTRequest1.AddBody(…如果有多个参数rg。第一个参数是映像名称,第二个映像blob内存流?
procedure TForm1.Button1Click(Sender: TObject);
begin
  IdHTTP1.Request.ContentType := 'image/jpeg';
  IdHTTP1.Post('http://myserver:1111//Openxxx/RecxxxLxxxPxxxx', 'image.jpg');
end;
function BytesToStr(abytes: tbytes): string;
var
  abyte: byte;
begin
   for abyte in abytes do
   begin
      Result := result + IntToStr(abyte) + ',';
   end;
   Result := '[' + Copy(Result, 1, Length(Result) - 1) + ']';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   ABytes: TBytes;
begin
   ABytes := TFile.ReadAllBytes('images.jpg');
   RESTRequest1.Params.AddItem('body', BytesToStr(ABytes), pkREQUESTBODY, [], ctAPPLICATION_JSON);
   RESTRequest1.Execute;
end;