Ir para conteúdo
  • Cadastre-se

dev botao

Integração com Api da Onvio(Domínio)


  • Este tópico foi criado há 1304 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá amigos,

Estou fazendo a integração do meu ERP com a Api da Onvio (Domínio) pelo Delphi 10, mas estou com dificuldade de enviar o xml para a Api. Precisa ser enviado dois parâmetros no body que é o arquivo e a query e como estou utilizando o IdHTTP não sei como informar eles em conjunto.  Hoje da forma que eu envio da retorno de erro "HTTP 415 Unsupported Media Type";

function TfrmIntOnvio.EnviarArquivosApi:Boolean;
    var F: TSearchRec;
    Ret: Integer;
    Auth : TNetHeaders;
    Caminho, Arquivo : String;
    Resultado: TStringStream;
    xReqBody: TStringStream;
    ArqOnvio: TIdMultiPartFormDataStream;
    Arq: TStringStream;
    begin
   try
      Caminho := edtUrlInt.Text;
      ArqOnvio := TIdMultiPartFormDataStream.Create;
      Auth := [TNetHeader.Create('Authorization', 'Bearer ' + access_token)];
      Ret := FindFirst(PastaLocal+'\*.xml', faAnyFile, F);
      while Ret = 0 do
      begin
        if (F.Name <> '.') And (F.Name <> '..') then
        begin
          Arquivo := verificaCaminho(PastaLocal) + F.Name;

          Arq := TStringStream.Create('file[]=' + Arquivo + '&'
                                    + 'query={"boxe/File": true};application/json',TEncoding.UTF8);
          Resultado := TStringStream.Create('', TEncoding.UTF8);
          DMAPI.httpApi.Post(Caminho, Arq, Resultado, Auth);
          mmoInfo.Lines.add('Arquivo Enviado ' + Resultado.DataString);
          Application.ProcessMessages;
       end;
       Ret := FindNext(F);
    end;
    except
     on e: Exception do
       showmessage(e.Message);
     end;
   end;

Na imagem tem exemplo funcional no postmam que pessoal do suporte da Api me enviou.

 

Formato_Valido.jpg

Link para o comentário
Compartilhar em outros sites

Estou usando o delphi 10.2 a principio é versão recente.

Fiz as mudanças para RestClient mas tenho uma duvida ainda como devo informar o valor da query. Tentei da forma que esta o código agora  e antes com as linhas que estão comentadas e nas duas situações retorna o erro 500, que pela documentação seria "Unexpected error on server.". Porem pelo postman se eu desmarca o file ou query também da erro 500, por isso acredito que forma que estou informando o body que não esteja correto.

try
    Caminho := edtUrlInt.Text;

    DMAPI.RESTClient.BaseURL     := Caminho;
    DMAPI.RESTClient.ContentType := 'multipart/form-data';
    DMAPI.RESTRequest.Client     := DMAPI.restClient;
    DMAPI.RESTRequest.Method     := rmPOST;
    DMAPI.RESTRequest.Response   := DMAPI.RESTResponse;
    DMAPI.RESTRequest.Params.AddHeader('Authorization', 'Bearer ' + access_token);
    DMAPI.RESTRequest.Params.ParameterByName('Authorization').Options := [poDoNotEncode];


    Ret := FindFirst(PastaLocal+'\*.xml', faAnyFile, F);
    while Ret = 0 do
    begin
       if (F.Name <> '.') And (F.Name <> '..') then
       begin
          Arquivo := verificaCaminho(PastaLocal) + F.Name;

          //DMAPI.RESTRequest.AddFile('file[]', arquivo, TRESTContentType.ctAPPLICATION_ATOM_XML);
          //DMAPI.RESTRequest.AddBody('query={"boxeFile":true}', TRESTContentType.ctAPPLICATION_JSON);

          DMAPI.RESTRequest.Params.AddItem;
          DMAPI.RESTRequest.Params.Items[1].name  := 'file[]';
          DMAPI.RESTRequest.Params.Items[1].Value := Arquivo;
          DMAPI.RESTRequest.Params.Items[1].ContentType := ctAPPLICATION_XML;
          DMAPI.RESTRequest.Params.Items[1].Kind  := TRESTRequestParameterKind.pkREQUESTBODY;

          DMAPI.RESTRequest.Params.AddItem;
          DMAPI.RESTRequest.Params.Items[2].name  := 'query';
          DMAPI.RESTRequest.Params.Items[2].Value := '{"boxe/File": true}';
          DMAPI.RESTRequest.Params.Items[2].ContentType := ctAPPLICATION_JSON;
          DMAPI.RESTRequest.Params.Items[2].Kind  := TRESTRequestParameterKind.pkREQUESTBODY;

          DMAPI.restRequest.Execute();

          if(DMAPI.RESTResponse.StatusCode = 201)then
          begin
            mmoInfo.Lines.add('Arquivo Enviado ' + DMAPI.RESTResponse.Content);
            Application.ProcessMessages;
          end
          else
          begin
             mmoInfo.Lines.add('Falha ao enviar o arquivo ' + DMAPI.RESTResponse.Content);
             Application.ProcessMessages;
          end;
       end;

       Ret := FindNext(F);
    end;
  except
  on e: Exception do
     showmessage(e.Message);
  end;

 

Link para o comentário
Compartilhar em outros sites

Configuração para o Indy:

Params := TIdMultiPartFormDataStream.Create;

Params.AddFile('file[]', 'C:\Desenvolvimento\Teste_Indy\31200305405941000129550010008979891610757381-nfe.xml', 'application/xml');
Params.AddFormField('query', '{"boxe/File":true}', 'UTF-8', 'application/json');

IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + token;
IdHTTP1.Request.Accept := 'application/json';
IdHTTP1.Request.ContentType := 'multipart/form-data';

Assim deverá funcionar.

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1304 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.