Jump to content

dev botao

Consumo de api via PUT enviando anexo por binary


Recommended Posts

  • Membros Pro

boa tarde!

Desculpa incomodar é um tema fora do portal mas estou precisando enviar um arquivo pdf por PUT.

Pelo postman eu consigo enviar mas quando tento montar o envio pelo delphi o arquivo vai vazio 

Estou add o arquivo este modo 

      TempStream := TMemoryStream.Create;
      TempStream.LoadFromFile(sBodyArquivo);

      restRequest.AddBody(TempStream,ctAPPLICATION_PDF);

--

Pelo postman funciona

curl --location --request PUT 'https://URL' \
--header 'Content-Type: application/pdf' \
--data '@/C:/Users/Downloads/Teste de documento a assinar.pdf'
 
image.thumb.png.ba89cedd289b55a20b7ff9055d9df9f7.png

--

Do modo que eu fiz ele envia o arquivo mas ele fica vazio mas quando manda pelo postman da certo.

eu tentei enviar o arquivo por form-data mas o serviço não aceita.

  try
    restClient   := TRESTClient.Create(nil);
    restRequest  := TRESTRequest.Create(restClient);
    restResponse := TRESTResponse.Create(restClient);

    try
      restClient.BaseURL   := pUrl;

      restRequest.Client   := restClient;
      restRequest.Method   := pTPMetodo;
      restRequest.Resource := '';
      restRequest.Response := restResponse;

      if iTimeOut > 0 then begin
        restRequest.Timeout := iTimeOut;
      end;

      iParametro := 0;
      restRequest.Params.Add;
      if pContentType = '' then
           restRequest.Params[iParametro].ContentType := ctNone
      else restRequest.Params[iParametro].ContentType := pContentType;

      if pTokem <> '' then begin
        restRequest.Params[iParametro].Kind          := pkHTTPHEADER;
        restRequest.Params[iParametro].name          := 'Authorization';
        restRequest.Params[iParametro].Value         := pTokem;
        restRequest.Params[iParametro].Options       := [poDoNotEncode];
      end;

      if pStringList <> nil then begin

        for I := 0 to pStringList.count -1 do begin

          sNome := copy(pStringList[i],1,pos('|',pStringList[i])-1);
          sValor:= copy(pStringList[i],pos('|',pStringList[i])+1,length(pStringList[i]));

          inc(iParametro);
          restRequest.Params.Add;
          restRequest.Params[iParametro].ContentType := ctNone;
          restRequest.Params[iParametro].Kind        := pkGETorPOST;
          restRequest.Params[iParametro].name        := sNome;
          restRequest.Params[iParametro].Value       := sValor;
          restRequest.Params[iParametro].Options     := [poDoNotEncode];
        end;

      end;

      if pParamHeader <> '' then begin
        inc(iParametro);
        restRequest.Params.Add;
        restRequest.Params[iParametro].ContentType := ctNone;
        restRequest.Params[iParametro].Kind        := pkGETorPOST;
        restRequest.Params[iParametro].Options     := [poDoNotEncode];
        restRequest.Params[iParametro].name        := pParamHeader;
        restRequest.Params[iParametro].Value       := pParamHeaderValor;
      end;

      TempStream := TMemoryStream.Create;
      TempStream.LoadFromFile(sBodyArquivo);

      restRequest.AddBody(TempStream,ctAPPLICATION_PDF);

      if trim(pContentType) <> '' then begin
        inc(iParametro);
        restRequest.Params.Add;
        restRequest.Params[iParametro].ContentType := pContentType;//ctAPPLICATION_XML;
        restRequest.Params[iParametro].Kind        := pkGETorPOST;
        restRequest.Params[iParametro].Options     := [poDoNotEncode];
        restRequest.Params[iParametro].name        := 'Content-Type';
        restRequest.Params[iParametro].Value       := pContentType;
      end;

      restRequest.Execute;

      if (restRequest.Response.StatusCode = 200) then begin

         result := 'OK';

      end else 
         result := 'Erro';     

    except
      result := '';
    end;
  finally
    FreeAndNil(restClient);
  end;

 

desde ja agradeço caso alguem saiba como resolver

 

 

Link to comment
Share on other sites

  • Moderadores

vou providenciar. mas lembrando o horse é para servidor o que tu quer é consumir a API e não criar uma

então está no caminho certo ou TRestClient ou usar o TNetHttpClient

Qual versão do delphi está usando?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Link to comment
Share on other sites

  • Membros Pro

bom dia!

É isso mesmo eu preciso consumir a api do servidor. 

Tentei enviar pelo restclient mas o arquivo chega corrompido 

function TApiAssinatura.ConsomeAPIArquivoteste(pTokem,pUrl :String; pTPMetodo :TRESTRequestMethod;pParamHeader:String = '';pParamHeaderValor:String='';
                                   pParamBody:String = ''; pStringList:TStringList=nil; iTimeOut:Integer= 0;sListaBody:TStringList=nil;
                                   pContentType:String=''; sBodyArquivo:string=''):string;
var
    restClient: TRESTClient;
    restRequest: TRESTRequest;
    restResponse: TRESTResponse;

    sErro, sNome, sValor :String;
    iParametro :Integer;
    I: Integer;
    TempStream : TMemoryStream;
    tFStream: TFileStream;
    sStream : TStream;
    sLista : tstringlist;
    sTeste : String;

    ABytes: TBytes;
begin

  try
    restClient   := TRESTClient.Create(nil);
    restRequest  := TRESTRequest.Create(restClient);
    restResponse := TRESTResponse.Create(restClient);

    try
      restClient.BaseURL   := pUrl;

      restRequest.Client   := restClient;
      restRequest.Method   := pTPMetodo;
      restRequest.Resource := '';
      restRequest.Response := restResponse;

      if iTimeOut > 0 then begin
        restRequest.Timeout := iTimeOut;
      end;

      iParametro := 0;
      restRequest.Params.Add;
      restRequest.Params[iParametro].ContentType := 'application/pdf';

      if sBodyArquivo <> '' then begin
{      tentei deste modo
        TempStream := TMemoryStream.Create;
        TempStream.LoadFromFile(sBodyArquivo);
        restRequest.AddBody(TempStream,ctAPPLICATION_PDF);
}

        ABytes := TFile.ReadAllBytes(sBodyArquivo);
        restRequest.Params.AddItem('body', BytesToStr(ABytes), pkREQUESTBODY, [], ctAPPLICATION_JSON);

      end;

      if trim(pContentType) <> '' then begin
        inc(iParametro);
        restRequest.Params.Add;
        restRequest.Params[iParametro].ContentType := pContentType;//ctAPPLICATION_XML;
        restRequest.Params[iParametro].Kind        := pkGETorPOST;
        restRequest.Params[iParametro].Options     := [poDoNotEncode];
        restRequest.Params[iParametro].name        := 'Content-Type';
        restRequest.Params[iParametro].Value       := pContentType;
      end;
      restRequest.Execute;

      if (restRequest.Response.StatusCode <> 200) then begin

         result := 'Erro '+restRequest.Response.StatusCode.ToString;

      end else
      if (restRequest.Response.StatusCode = 200) and (pTPMetodo = rmPUT) then begin
        result := '200';
      end else
      if restRequest.Response.JSONValue.ToString <> '' then begin
        sTeste := StringReplace(restRequest.Response.JSONText,'\', '', [rfReplaceAll]);
        result := sTeste;
      end;

    except
      result := '';
    end;
  finally
    FreeAndNil(restClient);
  end;
end;

Link to comment
Share on other sites

  • Administradores

Boa tarde,

Movido para a área aberta fim de mais colegas poderem apoiar.

At.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link to comment
Share on other sites

  • Membros Pro

Pessoal consegui consumir o serviço pode encerrar o tópico

https://github.com/viniciussanchez/RESTRequest4Delphi/discussions/171

procedure TForm1.Button1Click(Sender: TObject);
var
  lRes: IResponse;
  lStream: TMemoryStream;
begin
 try
  lStream := TMemoryStream.Create;
  lStream.LoadFromFile('C:\arquivo.pdf');
  lStream.Position := 0;
  lRes := TRequest.New
                  .BaseURL(url)
                  .AddHeader('', '')
                  .ContentType('application/pdf')
                  .AddBody(lStream, false)
                  .PUT;

  ShowMessage(IntToStr(lRes.StatusCode));

 finally
   lStream.Free;
 end;

end;

Link to comment
Share on other sites

  • Consultores

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultor SAC ACBr

Alexandre de Paula
Ajude o Projeto ACBr crescer - Assine o SAC                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

Link to comment
Share on other sites

  • Moderadores
17 horas atrás, AG Sistemas disse:

Pessoal consegui consumir o serviço pode encerrar o tópico

https://github.com/viniciussanchez/RESTRequest4Delphi/discussions/171

procedure TForm1.Button1Click(Sender: TObject);
var
  lRes: IResponse;
  lStream: TMemoryStream;
begin
 try
  lStream := TMemoryStream.Create;
  lStream.LoadFromFile('C:\arquivo.pdf');
  lStream.Position := 0;
  lRes := TRequest.New
                  .BaseURL(url)
                  .AddHeader('', '')
                  .ContentType('application/pdf')
                  .AddBody(lStream, false)
                  .PUT;

  ShowMessage(IntToStr(lRes.StatusCode));

 finally
   lStream.Free;
 end;

end;

só para ajudar um pouco mais se tu quiser fazer sem usar nada basta olhar a chamada desse código acima dentro pois ele usa restclient interno

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Link to comment
Share on other sites

  • Moderadores
Em 07/07/2024 at 15:40, AG Sistemas disse:

Pessoal consegui consumir o serviço pode encerrar o tópico

https://github.com/viniciussanchez/RESTRequest4Delphi/discussions/171

procedure TForm1.Button1Click(Sender: TObject);
var
  lRes: IResponse;
  lStream: TMemoryStream;
begin
 try
  lStream := TMemoryStream.Create;
  lStream.LoadFromFile('C:\arquivo.pdf');
  lStream.Position := 0;
  lRes := TRequest.New
                  .BaseURL(url)
                  .AddHeader('', '')
                  .ContentType('application/pdf')
                  .AddBody(lStream, false)
                  .PUT;

  ShowMessage(IntToStr(lRes.StatusCode));

 finally
   lStream.Free;
 end;

end;

só nível de explicação segue abaixo o código retirado usando o componente diretamente

///RESTRequest4D.Request.Client.pas corresponde ao TRestClient

//.BaseURL(url) 
FRESTClient.BaseURL := 'url';
//.AddHeader('', '')  
FRESTRequest.Params.clear;
//.ContentType('application/pdf') 
FRESTRequest.Params.AddHeader('Content-Type','application/pdf');
FRESTRequest.Params.ParameterByName('Content-Type').Options := [poDoNotEncode];
//.AddBody(lStream, false) 
{$IF COMPILERVERSION <= 29}
FRESTRequest.AddBody(lStream, TRESTContentType.ctAPPLICATION_OCTET_STREAM);
{$ELSE}
FRESTRequest.Body.Add(lStream, TRESTContentType.ctAPPLICATION_OCTET_STREAM);
// .PUT;
FRESTRequest.Method := TRESTRequestMethod.rmPUT;
FRESTRequest.Execute;

linhas comentadas são as do código lá da classe que encapsula

e as demais seria usando ocomponente direto TRestClient

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.