Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts


Estou precisando de enviar um arquivo XML para um WebService e estou tendo algumas dificuldades. Estou quebrando a cabeça, e tenho poucos dias para conseguir transmitir os arquivos. Então, pensei que talvez alguém do suporte possa me dar uma luz.

Tenho o seguinte cenário:
* Enviar uma requisição HTTP completa para o web service do SCB que deverá conter os headers semelhantes ao exemplo abaixo:

POST /scb/v1.0/bilheterias HTTP/1.1

Authorization: QWxhZGRpbjpvcGVuIHNlc2FtZQ 
Content-Type: application/json

* web service SCB segue o padrão REST

URL: https://scb.ancine.gov.br/scb/v1.0/bilheterias 

Método HTTP: POST


Meu código:

procedure TForm1.BtTransmiteClick(Sender: TObject);
Var Response: TStringStream;
Arquivo: TIdMultipartFormDataStream;
begin
Response := TStringStream.Create('');
Arquivo := TIdMultiPartFormDataStream.Create;
Try
Arquivo.AddFile('xml', 'c:\ancine.xml', 'xml/text');
IdHTTP.Request.CustomHeaders.Clear;
IdHTTP.Request.Clear;
IdHTTP.Request.Accept := 'text/xml';
IdHTTP.Request.ContentType := 'text/xml';
IdHTTP.Request.BasicAuthentication := True;
IdHTTP.Request.Authentication := TIdBasicAuthentication.Create;
IdHTTP.Request.Authentication.Password:= 'QWxhZGRpbjpvcGVuIHNlc2FtZQ';
IdHTTP.Request.Authentication.Username:= 'admin';
IdHTTP.Request.ContentEncoding := 'utf-8';
IdHTTP.Request.Referer := '/scb/v1.0/bilheterias HTTP/1.1';
IdHTTP.Post('http://scbcertificacao.ancine.gov.br/scb/v1.0/', Arquivo, Response);
finally
ShowMessage(Response.DataString);
Response.Free();
Arquivo.Free()
end;
end;



Componentes que estou utilizando:
TIdHTTP
TIdSSLIOHandlerSocket


Quando estou enviando o arquivo me Retorna o erro socket #10061 Connection refused
 

Desde já agradeço

Link para o comentário
Compartilhar em outros sites

Mudei o meu código para

Var Response: TStringStream;
  Arquivo: TIdMultipartFormDataStream;
begin
  Response := TStringStream.Create('');
  Arquivo := TIdMultiPartFormDataStream.Create;
  Try
     Arquivo.AddFile('xml', 'c:\ancine.xml', 'xml/text');
     IdHTTP.Request.CustomHeaders.Clear;
     IdHTTP.Request.Clear;
     IdHTTP.Request.BasicAuthentication := True;
     IdHTTP.Request.Authentication := TIdBasicAuthentication.Create;
     IdHTTP.Request.Accept := 'text/xml';
     IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';  
     IdHTTP.Request.ContentEncoding := 'multipart/form-data';
     IdHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';

     IdHTTP.Request.URL := 'http://scbcertificacao.ancine.gov.br/scb/v1.0/';
     IdHTTP.Request.Host := 'http://scbcertificacao.ancine.gov.br/scb/v1.0/';
     IdHTTP.Request.Referer := 'http://scbcertificacao.ancine.gov.br/scb/v1.0/';     
     IdHTTP.Request.Method := 'POST';
     IdHTTP.Request.Authentication.Username:= 'meuusername';
     IdHTTP.Request.Authentication.Password:= 'meupassword';
     Try
        screen.cursor := crSQLWait;
        Panel1.Visible := True;
        Refresh;
        IdHTTP.Post('https://scb.ancine.gov.br/scb/v1.0/bilheterias', Arquivo, Response);
        ShowMessage(Response.DataString);
     except
        on E: Exception do
        Begin
           Screen.Cursor := CrDefault;
           IdHTTP.Disconnect;
           if pos('400',E.Message) > 0 then
              ShowMessage('400 – Requisição ruim: A requisição não pôde ser interpretada pelo servidor em razão de erros de formato/sintaxe.')
           Else if pos('401',E.Message) > 0 then
              ShowMessage('401 – Não autorizado: A requisição requer autenticação por parte do cliente e as informações de autenticação não foram localizadas ou não são válidas.')
           Else
              ShowMessage(e.message);
           Panel1.Visible := False;
        end;
     end;
  finally
     Response.Free();
     Arquivo.Free();
     Panel1.Visible := False;
     Panel1.Caption := 'Tentando conexão com o ANCINE';
     Screen.Cursor := CrDefault;
  end;

Esta retornando o código:

Citar

Erro socket 400

procedure TForm1.IdHTTPConnected(Sender: TObject);
begin
    Panel1.Caption := 'Conectado ao ANCINE';
    Refresh;
    Sleep(1000);
end;

Parece-me que está conectando:

Como faço para passar a autorização?

Authorization: QWxhZGRpbjpvcGVuIHNlc2FtZQ 

 

Sem título.png

Link para o comentário
Compartilhar em outros sites

20 horas atrás, carlosmarian disse:

Você já conseguiu simular uma requisição usando outra ferramenta?
Tente simular por exemplo com o Complemento do Chrome Postman.
Você obteve o token?

 

at+

 

Carlos obrigado pela dica.

Sim eu tenho o Token só que não estou sabendo como passá-lo.

Estou precisando de mais esta dica. :-D

Pois está me retornando o código "HTTP Status 40- Unauthorized" conforme imagem em anexo.

 

 

Sem título.png

Link para o comentário
Compartilhar em outros sites

Beleza, 

Eu já consegui passar a autorização. Agora não estou conseguindo pegar o retorno.

Utilizei o complemento do Google Postman e nele me dá o arquivo retorno.
No caso do meu codigo + xml está me devolvendo o código 422, tanto no Postman quando no meu código, 
Como faço para visualizar o retorno? É algum componente?
Meu codigo:

Var Response: TStringStream;
   XArquivo : TMemoryStream; 
begin  
  Response := TStringStream.Create(''); 
  XArquivo := TMemoryStream.Create;
  Try  
     XArquivo.LoadFromFile('d:\sistema\arquivo.xml');
     IdHTTP.Request.CustomHeaders.Clear;
     IdHTTP.Request.Clear;
     IdHTTP.ConnectTimeout := 30000;
     idHTTP.OnAuthorization := IdHTTPAuthorization;
     IdHTTP.Request.ContentType := 'Application/xml';
     IdHTTP.Request.ContentEncoding := 'raw';
     IdHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';     
     IdHTTP.Request.CustomHeaders.AddValue('Authorization', 'kkkkcccccjjj99959dijjttllt86m0');     
     Try              
        IdHTTP.Post('http://servidor.com.br', XArquivo, Response);
        reResp.Text := Response.DataString;       
     except
        on E: Exception do
        Begin           
           IdHTTP.Disconnect;
           if pos('400',E.Message) > 0 then
              ShowMessage('400 – Requisição ruim: A requisição não pôde ser interpretada pelo servidor em razão de erros de formato/sintaxe.')
           Else if pos('401',E.Message) > 0 then
              ShowMessage('401 – Não autorizado:'#13#13'A requisição requer autenticação por parte do cliente e as informações de'#13'autenticação não foram localizadas ou não são válidas.')
           Else if pos('405',E.Message) > 0 then
              ShowMessage('405 – Método não permitido:'#13'O método HTTP utilizado não é permitido para o recurso identificado na URL')
           Else if pos('422',E.Message) > 0 then
              ShowMessage('422 – Entidade não processável:'#13'O servidor reconhece que as informações estão na sintaxe correta, mas seu conteúdo está semanticamente incorreto.')
           Else if pos('11001',E.Message) > 0 then
              ShowMessage('11001 – Sem conexão com a Internet')
           Else
              ShowMessage(e.message);           
        end;
     end;
  finally
     Response.Free();
     Arquivo.Free();
  end;

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Na resposta do Webservice tem a opção de enviar arquivo xml ou json.

Optei por enviar o arquivo xml.

IdHTTP.Request.ContentType := 'Application/xml';

IdHTTP.Request.ContentEncoding := 'raw';

Mas quando vem o retorno para mim, está vindo em Json

 

Como faço para trocar para xml?

 

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • Moderadores

acho que não tem não!

entrou em contato com eles para saber mas era exatamente esse o problema!

mas o delphi hoje lhe dá recurso pra converter os objetos json em objetos delphi!

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

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

 

Link para o comentário
Compartilhar em outros sites

  • 5 meses depois ...

Na resposta do Webservice tem a opção de enviar arquivo xml ou json.

Optei por enviar o arquivo xml.

IdHTTP.Request.ContentType := 'Application/xml';

IdHTTP.Request.ContentEncoding := 'raw';

Mas quando vem o retorno para mim, está vindo em Json

 

Como faço para trocar para xml?

 

Desde já agradeço.

Boa Noite, ressuscitando este tópico tópico porque até hoje não consegui resolver e meu prazo termina sexta-feira.

Estou enviando o meu arquivo XML. Consegui ajustar meu arquivo para transmissão. Quando envio o arquivo XML para utilizando o POSTMAN (sugerido pelo colega Carlosmarian) tenho o retorno bunitin conforme manual técnico. Veja retorno abaixo pelo postman,

<?xml version="1.0" encoding="UTF8" standalone="yes"?>
<statusRelatorioBilheteria>
    <registroANCINEExibidor>14813</registroANCINEExibidor>
    <registroANCINESala>5002408</registroANCINESala>
    <diaCinematografico>2017-03-18</diaCinematografico>
    <numeroProtocolo>5002408.1.18032017.013</numeroProtocolo>
    <statusProtocolo>A</statusProtocolo>
    <mensagens/>
</statusRelatorioBilheteria>

Quando envio pelo meu programa, e não tem nenhum erro no arquivo xml esta aparecendo a mensagem: UNSUPPORTED OPERATION. 

Quando dá erro no arquivo XML o retorno vem no formato jason.

 

Pergunta:

1) Que mensagem é essa meus colegas? 
2) Como faço para o retorno vir em XML?

 

Desde já agradeço

 

 

 

Link para o comentário
Compartilhar em outros sites

Não deu certo. dá seguinte erro:

Citar

{"tipo":"ParametroInvalido","descricao":"O tipo do argumento informado pelo usuário não corresponde ao esperado pela interface.","complemento":"O conteúdo passado deve ser no formato XML ou JSON e este tipo deve ser especificado no cabeçalho 'Content-Type'"}

Mais alguém?

 

Link para o comentário
Compartilhar em outros sites

  • Consultores
20 horas atrás, Digito Sistemas disse:

Não deu certo. dá seguinte erro:

Mais alguém?

 

Talvez ao invés de 'text/xml' ele espere alguma outra string. Verifique.

Se for o caso, instale um aplicativo como o fiddler e compare o do outro programa que funciona com o seu.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Obrigado pela ajuda gente, tô quase chegando lá:

Ainda não consegui pegar o arquivo XML mas consegui tirar a mensagem de Unsupported Operation no retorno do arquivo.

Consegui fazendo assim: acrescentei uma variável retorno tipo TStringTream 

 

procedure TForm1.Button1Click(Sender: TObject);
Var Response: TStringStream;
  XArquivo : TMemoryStream;
  Retorno : TStringStream;
begin
   Response := TStringStream.Create('');
   Retorno := TStringStream.Create('');
  XArquivo := TMemoryStream.Create;
     idHTTP.OnAuthorization := IdHTTPAuthorization;
     IdHTTP.Request.ContentType := 'Application/xml'; //Certo
     IdHTTP.Request.ContentEncoding := 'raw'; //Certo
     IdHTTP.Request.Accept := 'Application/xml';
     IdHTTP.Response.CharSet := 'UTF-8';
    IdHTTP.post('https://scbcertificacao.ancine.gov.br/scb/v1.0/', XArquivo, Retorno);
    reResp.Text := UTF8Encode(Retorno.DataString);

end;

 

Ainda preciso de retorno em xml!!!

 

 

Editado por Digito Sistemas
texto ficou errado.
Link para o comentário
Compartilhar em outros sites

Em 21/03/2017 at 18:53, Digito Sistemas disse:

Obrigado pela ajuda gente, tô quase chegando lá:

Ainda não consegui pegar o arquivo XML mas consegui tirar a mensagem de Unsupported Operation no retorno do arquivo.

Consegui fazendo assim: acrescentei uma variável retorno tipo TStringTream 

 

procedure TForm1.Button1Click(Sender: TObject);
Var Response: TStringStream;
  XArquivo : TMemoryStream;
  Retorno : TStringStream;
begin
   Response := TStringStream.Create('');
   Retorno := TStringStream.Create('');
  XArquivo := TMemoryStream.Create;
     idHTTP.OnAuthorization := IdHTTPAuthorization;
     IdHTTP.Request.ContentType := 'Application/xml'; //Certo
     IdHTTP.Request.ContentEncoding := 'raw'; //Certo
     IdHTTP.Request.Accept := 'Application/xml';
     IdHTTP.Response.CharSet := 'UTF-8';
    IdHTTP.post('https://scbcertificacao.ancine.gov.br/scb/v1.0/', XArquivo, Retorno);
    reResp.Text := UTF8Encode(Retorno.DataString);

end;

 

Ainda preciso de retorno em xml!!!

 

 

Veja como são as coisas, descobre o problema de não estar vindo o retorno em XML.

Na linha: IdHTTP.Request.ContentType := 'Application/xml'; 

Eu deveria ter colocado tudo em minusculo: IdHTTP.Request.ContentType := 'application/xml'; 

 

Pode um trem desse?

 

Obrigado a todos pela colaboração.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.