Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado
function EnviarRequisicaoHTTP: string;
var
  IdHTTP: TIdHTTP;
  SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  RequestBody: TStringStream;
begin
  Result := '';

  IdHTTP := TIdHTTP.Create(nil);
  SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  RequestBody := TStringStream.Create('{"x": "2333232", "x1": "12", "dt": "xxxxx}');

  try
    try
      IdHTTP.Request.ContentType := 'application/json';
      IdHTTP.Request.CustomHeaders.Add('x-api-dddddsdsds');

      SSLIOHandler.SSLOptions.Method := sslvTLSv1_2;

      IdHTTP.IOHandler := SSLIOHandler;

      Result := IdHTTP.Post('URL', RequestBody);
    except
      on E: Exception do
        Result := 'Erro ao enviar a requisição: ' + E.Message;
    end;
  finally
    IdHTTP.Free;
    SSLIOHandler.Free;
    RequestBody.Free;
  end;
end;

Uso delphi xe7 da erro
Erro ao enviar a requisição: Error connecting with SSL.
error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

 

Inclusive usando restDebugger do delphi

 

Com delphi alexandria vai numa boa. 

  • Membros Pro
Postado

Bom dia.

Parece que o Indy do XE7 está desatualizado - e pelo que li as versões a partir de 2018 corrigiram diversos problemas em relação ao SSL (infelizmente não consegui mais achar o link do StackOverflow onde havia lido sobre isso).

Desta forma a versão Alexandria está OK.

  • Curtir 1
Postado

Eh então, já e segunda API que tenho este tipo de problema. E não resolve atualizando DLL. Parece ser coisa de delphi mesmo; 
E pior que não sei se existe uma alternativa pra contornar. 

E no momento fora de cogitação de mudar o delphi

  • Membros Pro
Postado

Eu utilizo o XE6 com o Synapse e atende perfeitamente 99% das situações.

Tentou utilizar esta classe? É até mais simples que o Indy (o ACBr usa extensivamente o synapse).

  • Membros Pro
Postado (editado)

Segue um exemplo de como utilizo.

Neste caso eu criei uma classe para abstrair o Synapse, mas você pode utilizar diretamente o objeto THTTPSend.

No código abaixo existem algumas referências a funções auxiliares para converter Streams e caracteres Unicode, mas acho que dá para entender o contexto geral.

Uses: httpsend, synautil, synacode

Para usar:

Enviar('POST', 'https://endereco.da.api/v1/endpoint', '{"x": "2333232", "x1": "12", "dt": "xxxxx}', retorno);

O seu header de requisição teria que ser inserido em uma lista do objeto LHeaders.

function Enviar(const pMetodo, pURL, pDadosEnvio: string; var pRetorno: TRetRequisicao): Boolean;
var
   synHttp: THTTPSend;
   mstr: TMemoryStream;
   stmResp, stmDados: TStringStream;
   vs: RawByteString;
   tmp: string;
begin   
	synHttp := THTTPSend.Create;
	mstr := TMemoryStream.Create;
	try
	  vs := UTF8Encode(PDadosEnvio);
	  FH.StrParaStream(synHttp.Document, vs);
	  synHttp.MimeType := 'application/json'; //'application/x-www-form-urlencoded';
	  for tmp in LHeaders do
		  synHttp.Headers.Add(tmp);
	  Result := synHttp.HTTPMethod(pMetodo, pURL);
	  if Result then
	  begin
		 mstr.CopyFrom(synHttp.Document, 0);
		 pRetorno.Code := inttostr(synHttp.ResultCode);
		 pRetorno.Response := FH.AjustaChrEspecial(FH.MemoryStreamParaString(mstr), True);
	  end
	  else
	  begin
		 pRetorno.Code := inttostr(synHttp.ResultCode);
		 pRetorno.Response := FH.SeStrVazia(synHttp.Sock.LastErrorDesc, synHttp.ResultString);
	  end;
	finally
	  synHttp.Free;
	  mstr.Free;
	end;
end;

 

Editado por TiagoTecchio
edicao
  • Curtir 2
Postado (editado)
function Enviar(const pMetodo, pURL, pDadosEnvio: string;
  var pRetorno: TRetRequisicao): Boolean;
var
  synHttp: THTTPSend;
  mstr: TMemoryStream;
  stmResp, stmDados: TStringStream;
  vs: RawByteString;
  tmp: string;
  LHeaders: TStringList;

  requestBody: TStringStream;
begin
  synHttp := THTTPSend.Create;
  mstr := TMemoryStream.Create;
  LHeaders := TStringList.Create;
  LHeaders.Add('Content-Type: application/json');
  LHeaders.Add('x-api-key: minhakey');

  try
    vs := UTF8Encode(pDadosEnvio);
    //FH.StrParaStream(synHttp.Document, vs); ?????

    synHttp.MimeType := 'application/json';

   //Tentei colocar no synHttp.Document mas nem sei se isto esta certo.
    requestBody := TStringStream.Create(vs);
    synHttp.Document.Position := 0 ;
    synHttp.Document.LoadFromStream(requestBody);

    for tmp in LHeaders do
      synHttp.Headers.Add(tmp);

    Result := synHttp.HTTPMethod(pMetodo, pURL);
    if Result then
    begin
      mstr.CopyFrom(synHttp.Document, 0);
      pRetorno.StatusCode := inttostr(synHttp.ResultCode);
      // pRetorno.Response := FH.AjustaChrEspecial(FH.MemoryStreamParaString(mstr), True); ???????????????
    end
    else
    begin
      pRetorno.StatusCode := inttostr(synHttp.ResultCode);
      // pRetorno.Response := FH.SeStrVazia(synHttp.Sock.LastErrorDesc, synHttp.ResultString); ???????????????
    end;
  finally
    synHttp.Free;
    mstr.Free;
    LHeaders.Free;
  end;
end;

Detalhe coloquei o type

type
  TRetRequisicao = record
    StatusCode: String;
    Response: String;
  end;

Retorna 500 de toda forma

Editado por johnbh3
erro
Postado

Agora vou deitar pq briguei demais com isto hj kkk

function HttpPostGetJSON(const URL: string; var JSON: String;const TimeOut: integer = 5000): Boolean;
const
    CRLF : UTF8String = #13#10;
var
    HTTP    : THTTPSend;
    Data    : TStringStream;
begin
    HTTP := THTTPSend.Create;
    Data := TStringStream.Create(UTF8Encode(JSON), TEncoding.UTF8);
    JSON := '';
    HTTP.Timeout := TimeOut;

    try
        HTTP.Headers.Add('Content-Type: application/json') ;
        HTTP.Headers.Add('x-api-key: ?????????????????????????????????????????') ;
        HTTP.MimeType := 'application/json';
        Data.Position := 0;


        HTTP.Document.CopyFrom( Data, 0);
        Data.Size := 0;
        Result := HTTP.HTTPMethod('POST', URL);
        if Result then
        begin
            if HTTP.Document.Size > 0 then
            begin
                Data.LoadFromStream( HTTP.Document );
                JSON := Data.DataString + CRLF + 'Result=' + HTTP.ResultString + CRLF+ 'Protocol='+HTTP.Protocol ;
            end;
        end
        else
        begin
          ShowMessage(HTTP.ResultCode.ToString)
        end;
    finally
        HTTP.Free;
        Data.Free;
    end;
end;

Da o mesmo 500 como retorno. 

  • Este tópico foi criado há 366 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.