Arrays delphi将文件作为字节数组发送到Rest服务
我正在使用Delphi10.1 我想使用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
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;