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.

The popup will be closed in 10 seconds...