es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Tipos incompatibles: ‘System.TArray‘ y ‘TNameValuePair’ al utilizar el encabezado de autenticación básica.

He estado tratando de usar los componentes NetHTTPRequest y NetHTTPClient en Delphi para emitir una solicitud de autenticación básica, pero he tenido problemas con el método NetHTTPRequest.Get

Básicamente, el método requiere tres parámetros, a saber, URL(String), un flujo de memoria y el encabezado del tipo TNetHeader.

No sé por qué, pero cuando intento pasar el encabezado recién creado, obtengo el error mencionado en el título, es decir:

Incompatible types: ‘System.TArray<system.net.urlclient.tnamevaluepair>’ y ‘TNameValuePair’

No sé si tengo que hacer una conversión, y si es así, ¿a qué lo tengo que convertir?

Por supuesto, si no paso el encabezado de autenticación básica, el servidor simplemente devuelve un 401 porque no ve ninguna credencial o encabezado para decodificar…

Aquí está el código:

procedure TForm1.Button1Click(Sender: TObject);
var
  HTTPResponseString: String;

begin
  if IsLoggedIn = False then
  begin
    if Edit2.Text = '' then
    begin
      ShowMessage('La contraseña no puede estar vacía');
      exit;
    end;

    BasicAuth := username + ':' + Edit2.Text; 
    AuthentificationPacket := EncodeBase64(UTF8Bytes(utf8string(BasicAuth)));

    HTTPHeader := TNetHeader.Create('Authorization: Basic', AuthentificationPacket);

    try
      HTTPResponseLogin := NetHTTPRequest1.Get(HTTPLoginRequest, nil, HTTPHeader);

      ShowMessage(HTTPResponselogin.ContentAsString());
      IsLoggedIn := True;

    except
      on E: Exception do
      ShowMessage(E.Message);

    end;

    Button1.Text := 'CERRAR SESIÓN';

  end
  else if IsLoggedIn then
  begin
    Edit1.Text := '';
    Edit2.Text := '';
    username := '';
    password := '';
    tagid := '';

    Button1.Enabled := False;
    Button1.Text := 'INICIAR SESIÓN';
    IsLoggedIn := False;

    Timer1.Enabled := False;
    IdleTimer := 0;

    Application.OnIdle := nil;

  end;

end;

La línea problemática es, por supuesto, la NetHTTPRequest1.Get(HTTPLoginRequest, nil, HTTPHeader);

Donde HTTPHeader está marcado como incompatible…

¡Cualquier ayuda es apreciada!</system.net.urlclient.tnamevaluepair>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está con el tipo de HTTPHeader. El método TNetHeader.Create está devolviendo un TArray<tnamevaluepair> y el método NetHTTPRequest.Get requiere un TNetHeader como tercer parámetro.

    Puedes intentar cambiar la declaración de HTTPHeader a TArray<tnamevaluepair> y pasarlo directamente al método Get de esta manera:

    var
      HTTPResponseString: String;
      HTTPHeader: TArray<tnamevaluepair>;
    
    begin
      // ... otro código
    
      // crear el encabezado con un arreglo de TNameValuePair
      HTTPHeader := TNetHeader.Create(['Authorization: Basic', AuthentificationPacket]);
    
      try
        // pasar el arreglo HTTPHeader directamente al método Get
        HTTPResponseLogin := NetHTTPRequest1.Get(HTTPLoginRequest, nil, HTTPHeader);
    
        // ... otro código
      end;
    
    end;
    

    Esto debería resolver el error de tipos incompatibles. Avísame si esto funciona para ti.

Comments are closed.