Ir para conteúdo
  • Cadastre-se

dev botao

Requisicao rest idhttp SSL3_GET_RECORD:wrong version number


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

Recommended Posts

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. 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

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
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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. 

Link para o comentário
Compartilhar em outros sites

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