Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Erro com POST no IdHTTP do Indy


robinhocne

Pergunta

Estou tentando realizar um post e estou tendo esse erro : 

 

HTTP/1.1 401 Unauthorized

abaixo meu codigo;

procedure TForm2.Button1Click(Sender: TObject);
var dados : TStrings;
retorno : string;
begin
IdHTTP1.Request.CustomHeaders.Clear;
IdHTTP1.Request.ContentType := 'application/json';
IdHTTP1.Request.Connection := 'Keep-Alive';
IdHTTP1.Request.UserAgent := 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36';
IdHTTP1.HandleRedirects := true;
dados := TStringList.Create();
try
dados.Add(Memo1.Text);
retorno := IdHTTP1.Post('http://127.0.0.1:888/api/teste/pedido_venda/inclui',dados);
finally
end;
dados.Free;
end;

 

Link para o comentário
Compartilhar em outros sites

23 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde,

 

  Jhonas eu tenho uma missão de realizar a integração do meu sistema com o sistema retaguarda, esse sistema é fechado e unico acesso que tenho é por API, tenho que mandar meus dados por um JSON, então estou tentando se comunicar basicamente primeiro, fiz testes no postman para verificar se está funcionando a API e ocorreu tudo bem, consigo fazer o post.

 

  Agora preciso montar uma aplicação no delphi, então coloquei um memo, coloquei o mesmo dados em JSON que funcionou no postman, nesse memo e utilizei esse codigo que passei acima.

 

   Não sei mais o que fazer, consegue me ajudar, a API está local na minha maquina para teste.

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas....eu já tentei também desse exemplo....bom de tanto sofrer hoje eu consegui progredir há não gerar mais o erro de autenticação, porque descobri que a API solicita autenticação, então fiz dessa maneira:

 


procedure TForm2.Button1Click(Sender: TObject);
var
  URL, Retorno: String;
  JsonStreamRetorno, JsonStreamEnvio: TStringStream;
begin
  URL := 'http://username:password@127.0.0.1:888/api/millenium_eco/pedido_venda/inclui';
  JsonStreamEnvio := TStringStream.Create(Memo1.Text);
  JsonStreamRetorno := TStringStream.Create('');

  // Init request:
  try
    idHttp.Request.Clear;

    idHttp.Request.ContentType := 'application/json';
    idhttp.Request.Charset := 'utf-8';

    idHttp.Request.BasicAuthentication := true;

    idHttp.Request.ContentType := 'application/json;odata=light;charset=utf-8;';
    idHttp.Request.Connection  := 'keep-alive';
    idHttp.Request.UserAgent   := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36';
    idHttp.Request.AcceptEncoding := 'gzip, deflate';
    idHttp.Request.AcceptLanguage := 'pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4';
    idHttp.Request.CacheControl := 'no-cache';


    try

      idHttp.Post(URL, JsonStreamEnvio, JsonStreamRetorno);

      Memo2.Text := IdHTTP.Post(URL, JsonStreamEnvio);

    except

      on E:EIdHTTPProtocolException do

        Memo2.Lines.Add(e.ErrorMessage);

    end;

   finally
     memo2.Lines.add(JsonStreamRetorno.DataString);
   end;

end;

 

Então....ele passa pelo metodo post, mas não me retorna nada.....

35 minutos atrás, Jhonas disse:

o teste do seu código em minha maquina deu o erro que te passei.

veja esse exemplo e observe o numero da porta

https://pythonhosted.org/TGWebServices/examples/delphi.html

abraço

Adaptando esse codigo....

 


procedure TForm2.Button2Click(Sender: TObject);
begin
  Memo2.Text := dopost('json',Memo1.Text);
end;

function TForm2.dopost(AFormat, ARequest: string): string;
var
  RBody: TStringStream;
begin
  RBody := TStringStream.Create(ARequest);
  try
    if AFormat = 'json' then
    begin
      idHttp.Request.ContentType := 'application/json';
      idHttp.Request.ContentEncoding := 'utf-8';      
    end
    else
    begin
      idHttp.Request.Accept := 'text/xml';
      idHttp.Request.ContentType := 'text/xml';
      idHttp.Request.ContentEncoding := 'utf-8';
    end;
    idHttp.Request.BasicAuthentication := True;
    idHttp.Request.Authentication := TIdBasicAuthentication.Create;
    idHttp.Request.Authentication.Username := 'robinho';
    idHttp.Request.Authentication.Password := '123456';
    Result := idHttp.Post('http://127.0.0.1:888/api/millenium_eco/pedido_venda/inclui', RBody);
  finally
    FreeAndNil(RBody);
    FreeAndNil(idHttp);
  end;

end;

dá erro de 

 

First chance exception at $7628A932. Exception class EIdHTTPProtocolException with message 'HTTP/1.1 401 Unauthorized'. Process PostJSON.exe (15160)

 

passando a autenticação 

 

    idHttp.Request.BasicAuthentication := True;
    idHttp.Request.Authentication := TIdBasicAuthentication.Create;
    //idHttp.Request.Authentication.Username := 'robinho';
    //idHttp.Request.Authentication.Password := '123456';
    Result := idHttp.Post('http://robinho:123456@127.0.0.1:888/api/millenium_eco/pedido_venda/inclui', RBody);

 

ele não retorna nada....

Link para o comentário
Compartilhar em outros sites

  • 0

veja se esse link te ajuda

http://stackoverflow.com/questions/17897521/post-json-data-to-restful-datasnap-server-from-delphi-client/17917259

 

procedure TForm1.Button2Click(Sender: TObject);
var URL, Retorno: String;
    JsonStreamRetorno: TStringStream; JsonStreamEnvio : TStringList;
begin

   URL := 'http://127.0.0.1:8080';
   JsonStreamEnvio := TStringList.Create;
   JsonStreamRetorno := TStringStream.Create('');

   IdHTTP1.Request.ContentType := 'application/json';
   IdHTTP1.Request.AcceptCharSet := 'UTF-8';
   IdHTTP1.IOHandler := IdSSLIOHandlerSocket1;
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.BasicAuthentication := False;
   IdHTTP1.Request.Username := 'usuario';
   IdHTTP1.Request.password := 'senha';
   IdHTTP1.Response.ContentType := 'application/json';
   IdHTTP1.Response.ResponseText := 'UTF-8';
   IdHTTP1.BoundPortMax := 5000;

   try
      JsonStreamEnvio.Add('Json');

      idHttp1.Post(url, JsonStreamEnvio, JsonStreamRetorno);

      JsonStreamRetorno.Position := 0;
      Memo1.Lines.LoadFromStream(JsonStreamRetorno);
   finally
      JsonStreamEnvio.Free();
      JsonStreamRetorno.Free();
   end;

end;

OBS: Nesse pequeno teste, ele pede uma dll que eu não tenho instalado.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite, Jhonas baixei a dll coloquei na pasta do .exe, e ainda tá dando erro;

meu uses;

 

, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
  IdServerIOHandler;

 

Sem título6.png

Link para o comentário
Compartilhar em outros sites

  • 0

Show, mas não seria só colocar as dlls no system32 ou na pasta do .exe.... está dando erro

 

First chance exception at $7628A932. Exception class EIdOSSLCouldNotLoadSSLLibrary with message 'Could not load SSL library.'. Process PostJSON.exe (10284)

 

Link para o comentário
Compartilhar em outros sites

  • 0
  • 0

o .jar voce muda para .zip  que ele mostra os arquivos

o segundo é um programa .exe que esta no zip ( ignore esse )

voce tem que procurar para a versão do seu delphi

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/OpenSSL

OBS: se não conseguir, tente outra abordagem ( idFTP )

abraço

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia,

 

  Jhonas consegui resolver a dll instalando a versão Win32 OpenSSL v1.0.2k Light desse caminho http://external.informer.com/slproweb.com/ .

  Bom, parou de dar o erro de dll, mas infelizmente não me retorna nada.....

veja como ficou meu codigo;

 


procedure TForm2.Button3Click(Sender: TObject);
var URL, Retorno: String;
    JsonStreamRetorno: TStringStream; JsonStreamEnvio : TStringList;
begin

   URL := 'http://127.0.0.1:888/api/teste/pedido_venda/inclui';
   JsonStreamEnvio := TStringList.Create;
   JsonStreamRetorno := TStringStream.Create('');

   idHttp.Request.Clear;
   idHttp.Request.ContentType := 'application/json';
   idHttp.Request.AcceptCharSet := 'UTF-8';
   idHttp.Request.BasicAuthentication := False;
   idHttp.Request.Username := 'robinho';
   idHttp.Request.password := '123456';
   idHttp.Response.ResponseText := 'UTF-8';
   idHttp.BoundPortMax := 5000;
   idHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1;


   try
      JsonStreamEnvio.Add(Memo1.Text);

      idHttp.Post(url, JsonStreamEnvio, JsonStreamRetorno);

      JsonStreamRetorno.Position := 0;
      Memo2.Lines.LoadFromStream(JsonStreamRetorno);
   finally
      JsonStreamEnvio.Free();
      JsonStreamRetorno.Free();
   end;



end;

Não sei mais o que fazer :'(

Pelo RestClient como eu faria ?

13 horas atrás, Jhonas disse:

Jhonas tentei fazer esse mas adaptando ao meu.....fiz assim:


procedure TForm2.Button5Click(Sender: TObject);
var URL, Retorno: String;
    JsonStreamRetorno: TStringStream; JsonStreamEnvio : TStringList;
begin

   URL := 'http://www.nif.pt/?json=1&q=509442013';
   JsonStreamEnvio := TStringList.Create;
   JsonStreamRetorno := TStringStream.Create('');

   idHttp.Request.Clear;
   idHttp.Request.ContentType := 'application/json';
   idHttp.Request.AcceptCharSet := 'UTF-8';
   //idHttp.Request.BasicAuthentication := False;
   //idHttp.Request.Username := 'robinho';
   //idHttp.Request.password := 'rb823321';
   idHttp.Response.ResponseText := 'UTF-8';
   idHttp.BoundPortMax := 5000;
   idHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1;


   try
      JsonStreamEnvio.Add(Memo1.Text);

      idHttp.Get(url, JsonStreamRetorno);

      Memo2.Lines.LoadFromStream(JsonStreamRetorno);
   finally
      JsonStreamEnvio.Free();
      JsonStreamRetorno.Free();
   end;

end;

Não estou tendo retorno também, aqui na empresa tem proxy será que é o proxy ? ou estou carregando o retorno certo mesmo ? plis 

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite, Jhonas é alguma treta do componente mesmo, porque fiz um simples teste em JSON de uma api qualquer em casa e não funcionou, proxy não é porque desabilitamos o proxy para testar, desabilitei o firewall também, nem um get de um JSon não consegui com esse componente, sinceramente acredito que não funcione mesmo.

Link para o comentário
Compartilhar em outros sites

  • 0

no delphi berlin não sei te dizer, mas sei que no delphi 7 funciona.

como te falei, tente outra abordagem usando o componente idFTP 

ou então tente entrar em contato com o suporte da embarcadero, para tentar resolver isso

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
14 horas atrás, Jhonas disse:

no delphi berlin não sei te dizer, mas sei que no delphi 7 funciona.

como te falei, tente outra abordagem usando o componente idFTP 

ou então tente entrar em contato com o suporte da embarcadero, para tentar resolver isso

abraço

Bom dia, Jhonas com o delphi 7 dá esse erro 

 

com o FTP como seria ?

 

 

Screenshot_2.png

Link para o comentário
Compartilhar em outros sites

  • 0

o erro apresentado é de endereço não autorizado.

no caso do FTP seria para fazer download de arquivo para a sua maquina ou upload da sua maquina para um servidor ....  não sei se é isso que voce esta querendo.

Link para o comentário
Compartilhar em outros sites

  • 0

tente sem usar o JSON

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var lParams :TStringList;
   lResponse : TStringStream;
begin
   lParams := TStringList.Create;
   lResponse := TStringStream.Create('');

   try
      lParams.Add('filt=all');
      lParams.Add('p=balaio%20tecnologico');
      idHttp1.Post('http://br.search.yahoo.com/search', lParams, lResponse);

      { Exemplo de uso do response : carregar o conteúdo num Memo : }
      lResponse.Position := 0;
      Memo1.Lines.LoadFromStream(lResponse);
   finally
      lParams.Free();
      lResponse.Free();
   end;

end;

end.

Resultado:

<!doctype html><html id="Stencil" class="NoJs" lang="pt-BR"><head><meta http-equiv="x-dns-prefetch-control" content="on"><meta http-equiv="content-type" content="text/html; charset=UTF-8"><link rel="apple-touch-icon" sizes="72x72" href="http://l.yimg.com/pv/static/img/yahoo_purple_icon_ipad_76.png" /><link rel="apple-touch-icon" sizes="144x144" href="http://l.yimg.com/pv/static/img/yahoo_purple_icon_ipad_152.png" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><noscript><meta http-equiv="refresh" content="0;url=http://br.search.yahoo.com/search?p=balaio%2520tecnologico&ei=UTF-8&nojs=1"></noscript><script>(function(){var o=window,m=document,q,f,i;var h=2,g="\x03",e="\x04",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-";function c(w){if(!w){return null}w._r=h;var x=[],t=0,s;for(s in w){var d=w;

OBS: postei somente parte do conteudo

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...