Saya menggunakan Delphi 10.1 Berlin

Saya ingin mengirim data gambar sebagai TBytes ke layanan Istirahat menggunakan TRestRequest, tetapi saya tidak dapat menemukan cara untuk meneruskan TBytes ke metode TRestRequest.AddBody(), atau metode lainnya metode.

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]
4
Enes Köroğlu 15 Maret 2017, 17:04

2 jawaban

Jawaban Terbaik

Saya telah memecahkan masalah saya seperti di bawah ini:

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;
1
Enes Köroğlu 16 Maret 2017, 11:14

TRESTRequest.AddBody() memiliki kelebihan yang menerima TStream sebagai masukan. Anda dapat membungkus TBytes Anda menjadi TStream menggunakan TBytesStream kelas.

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;

Atau, gunakan TRESTRequestParameterList.AddItem, yang memiliki kelebihan untuk TBytes:

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

Karena itu, saya menemukan TRESTClient terlalu rumit dan bermasalah/membatasi. Lebih sering daripada tidak, TIdHTTP Indy lebih mudah digunakan, misalnya:

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;
procedure TForm1.Button1Click(Sender: TObject);
begin
  IdHTTP1.Request.ContentType := 'image/jpeg';
  IdHTTP1.Post('http://myserver:1111//Openxxx/RecxxxLxxxPxxxx', 'image.jpg');
end;
4
Remy Lebeau 17 Maret 2017, 15:25