Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Delphi para la web (https://www.clubdelphi.com/foros/forumdisplay.php?f=51)
-   -   variable tipo AnsiString para un Token (https://www.clubdelphi.com/foros/showthread.php?t=94869)

novato_erick 11-09-2020 21:10:44

variable tipo AnsiString para un Token
 
Hola Chicos estoy en la fase de integraciones de la aplicación de escritorio y web la cual me obligó a Actualizar mi IDE de XE7 a XE10.4 bueno en realidad estoy con el Trial ya que no he logrado avances significativos con certificados SSL/TSL con los componentes de INDY y REST de XE7.

En fin el dolor de cabeza se me quitó ya que XE10.4 no me tengo que preocupar de eso. sin embargo como puse en mi título hay algo que no comprendo.

recibo el token de la API y la almaceno en una variable de Tipo String el problema está es que al pasarlo como parametro la respuesta es error 401 en fin aquí está el código:

Código Delphi [-]

procedure TfrmPagoCedula.ConsultaSaldo(CedulaCliente: String);
var
    RutaUrl, parametro, barer, CuerpoRespuesta: String;
    CargaToken: TextFile;
    MiConsultaCedula, VariableDirectaTabla: AnsiString;
begin

//En una tutenficación la respuesta del toquen lo hago directamente desde una  FDMemTable
eToken.Text :=  FDMemTable1accessToken.AsString;
//o
Memo1.Text :=  FDMemTable1accessToken.AsString;
//Almaceno directamente desde el FDMenTable1
VariableDirectaTabla := FDMemTable1accessToken.AsString;

   BalanceSaldo := 0;
    RutaUrl :=
      'https://miDominio.com/api/services/app/Transaction/ValidateTransactionParameter';
  MiConsultaCedula :=
      '{"identifierType": 1,"identifierNumber": "4-713-257","branchId": "123","trackingId": "123","programCode": "ENTIDAD"}';
//
     RequestBody :=
      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2Fw' +
      'Lm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjI3N' +
      'SIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2' +
      'xhaW1zL25hbWUiOiJXb25nMjAiLCJBc3BOZXQuSWRlbnRpdHkuU2VjdXJpdHlTdGFtcCI' +
      '6IjY1RlhCUlRSSVlGVFRUUENMVFFRWUk2M05CMkFLSTVZIiwiaHR0cDovL3NjaGVtYXMu' +
      'bWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjoiQ2Fza' +
      'GllciAtIEFiYXJyb3RlcmlhIiwiaHR0cDovL3d3dy5hc3BuZXRib2lsZXJwbGF0ZS5jb2' +
      '0vaWRlbnRpdHkvY2xhaW1zL3RlbmFudElkIjoiMjQ0IiwiQXBwbGljYXRpb25fVXNlckFj' +
      'Y2Vzc2libGVFbnRpdGllcyI6Ilt7XCJFbnRpdHlJZFwiOjEsXCJFbnRpdHlUeXBlXCI6Mn' +
      '1dIiwic3ViIjoiMjc1IiwianRpIjoiNDNkOGY5ZjQtODk4Mi00N2E0LWI1ZTYtZTAzZjc1' +
      'YjY2Yjg4IiwiaWF0IjoxNTk5ODQwMjUxLCJuYmYiOjE1OTk4NDAyNTEsImV4cCI6MTU5OT' +
      'g2MTg1MSwiaXNzIjoiU29saWRhcml0eSIsImF1ZCI6IlNvbGlkYXJpdHkifQ.6wvJyvgQQg'
      + 'LqC7VN2TDdjD-_fbh33gOAkso2FeXwFSI';
// el RequestBody haciendolo de esta menera me trae la respuesta sin problema
 RESTReques.Params[0].Value := 'Bearen ' + RequestBody; //<---OK

//al Hacerlo de esta forma me manda el error 401 de no autorizado antes mencionado
 RESTReques.Params[0].Value := 'Bearen ' + VariableDirectaTabla; //<--- 401 no Autorizado

 RESTReques.Execute;

end;

Cual es la diferencia entre una y la otra esto me tiene desconcertado ya que el token según la API cambia cada 24 hora y lo actualizo en un archivo de Texto y tiene que ser almacenado, verificado y utilizado.

Saludos;

novatoerick

Casimiro Notevi 11-09-2020 22:51:34

No se ve en el código que has puesto, pero RequestBody seguramente es unicode y VariableDirectaTabla veo que es ansistring.

novato_erick 12-09-2020 04:28:51

Cita:

Empezado por Casimiro Notevi (Mensaje 538482)
No se ve en el código que has puesto

---------------------------
Debugger Exception Notification
---------------------------
Project ApiRestPrueba.exe raised exception class EHTTPProtocolException with message 'HTTP/1.1 401 Unauthorized'.
---------------------------
Break Continue Help
---------------------------


Código Delphi [-]
var
TokenBearer: AnsiString; //<--- FDMemTable1accessToken.AsString; Directo

Requestbody: String; //<---'      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2Fw' +
                               // 'Lm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjI3N' +
                               //'SIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2'; copiando el token

aún cambiando las variables a String Ambas igual tengo el mismo problema cómo comenté intente guardando el token que se actualiza según la api cada 24 horas en un archivo de Texto Denominado Token.txt para luego ser leido el archivo al colocarlo en un Memo de esta manera siempre utilizando el mismo tipo de variables del RequestBody.

Código Delphi [-]

    if RESTResponse1.StatusCode = 200 then
    begin
        RESTResponseDataSetAdapter1.Active := True;
        RESTResponseDataSetAdapter1.AutoUpdate := True;
        FDMemTable1.Active := True;
        Token := FDMemTable1accessToken.AsString;
        eToken.Text :=  FDMemTable1accessToken.AsString;
        TokenBody := Token;
        Token := 'Bearer ' + Token;
        AssignFile(Fichero, 'C:\MIS APPS\Token.txt');
        try
            Rewrite(Fichero);
            Write(Fichero, Token);
        finally
            CloseFile(Fichero);
        end;

        Memo1.Text := TokenBody;
        TokenBody1 := '';
        TokenBody2 := '';
        TokenBody3 := '';
        TokenBody4 := '';
        TokenBody5 := '';
        TokenBody6 := '';
        TokenBody7 := '';
        TokenBody8 := '';
        TokenBody9 := '';

        Label2.Caption := IntToStr(Memo1.Lines.Count);
        for I := 0 to Memo1.Lines.Count - 1 do
        begin
            if (I = 0) and (TokenBody1 = '') then
            begin
                TokenBody1 := Memo1.Lines.Strings[i];
            end;
            if (I = 1) and (TokenBody2 = '') then
            begin
                TokenBody2 := Memo1.Lines.Strings[i];
            end;
            if (I = 2) and (TokenBody3 = '') then
            begin
                TokenBody3 := Memo1.Lines.Strings[i];
            end;
            if (I = 3) and (TokenBody4 = '') then
            begin
                TokenBody4 := Memo1.Lines.Strings[i];
            end;
            if (I = 4) and (TokenBody5 = '') then
            begin
                TokenBody5 := Memo1.Lines.Strings[i];
            end;
            if (I = 5) and (TokenBody6 = '') then
            begin
                TokenBody6 := Memo1.Lines.Strings[i];
            end;
            if (I = 6) and (TokenBody7 = '') then
            begin
                TokenBody7 := Memo1.Lines.Strings[i];
            end;
            if (I = 7) and (TokenBody8 = '') then
            begin
                TokenBody8 := Memo1.Lines.Strings[i];
            end;
            if (I = 8) and (TokenBody9 = '') then
            begin
                TokenBody9 := Memo1.Lines.Strings[i];
            end;
        end;
        TokenBearer := TokenBody1 + TokenBody2 + TokenBody3 + TokenBody4 +
          TokenBody5 + TokenBody6 + TokenBody7 + TokenBody8 + TokenBody9;

En fin AnsiString o String en ambos tipos de variables el RequestBody almacenado antes descrito funciona sin embargo el llamado desde el archivo de texto o almacenado desde el mismo componente FDMemTable.AsString no me estan funcionando.

y tomando tu referencia en Carácteres Unicode encontre esto: https://jachguate.wordpress.com/2012...elphi-parte-i/
Cita:

En Delphi 2009 o superior, al declarar una variable de tipo Char, PChar o string, estamos declarando contenedores que tienen soporte para el conjunto de caracteres Unicode, y por tanto pueden representar información textual de cualquier alfabeto soportado por el estándar, como japonés, chino, árabe, cirílico, sin olvidar las lenguas latinas como el español, portugués, francés, italiano y y otras.

Saludos casimironotevi gracias por responderme..

Casimiro Notevi 12-09-2020 10:33:35

No me queda claro tu explicación, ansistring no es unicode. ¿Cuándo te funciona y cuándo no? Y si funciona de alguna forma, ¿cuál es el problema entonces?

novato_erick 12-09-2020 16:13:02

Cita:

Empezado por Casimiro Notevi (Mensaje 538485)
No me queda claro tu explicación, ansistring no es unicode. ¿Cuándo te funciona y cuándo no? Y si funciona de alguna forma, ¿cuál es el problema entonces?

Disculpa por poner mas verduras a la sopa...

Funciona solamente es agregando el token directamente a la variable sea String o AnsiString pero directamente desde copy and paste en el codigo fuente.

Código Delphi [-]
//De esta manera funciona tanto en AnsiString o String pero tengo que copiarlo y pegarlo directamente desde el RESTDebugger a la hora de la respuesta
     RequestBody :=
      'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2Fw' +
      'Lm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjI3N' +
      'SIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2' +
      'xhaW1zL25hbWUiOiJXb25nMjAiLCJBc3BOZXQuSWRlbnRpdHkuU2VjdXJpdHlTdGFtcCI' +
      '6IjY1RlhCUlRSSVlGVFRUUENMVFFRWUk2M05CMkFLSTVZIiwiaHR0cDovL3NjaGVtYXMu' +
      'bWljcm9zb2Z0LmNvbS93cy8yMDA4LzA2L2lkZW50aXR5L2NsYWltcy9yb2xlIjoiQ2Fza' +
      'GllciAtIEFiYXJyb3RlcmlhIiwiaHR0cDovL3d3dy5hc3BuZXRib2lsZXJwbGF0ZS5jb2' +
      '0vaWRlbnRpdHkvY2xhaW1zL3RlbmFudElkIjoiMjQ0IiwiQXBwbGljYXRpb25fVXNlckFj' +
      'Y2Vzc2libGVFbnRpdGllcyI6Ilt7XCJFbnRpdHlJZFwiOjEsXCJFbnRpdHlUeXBlXCI6Mn' +
      '1dIiwic3ViIjoiMjc1IiwianRpIjoiNDNkOGY5ZjQtODk4Mi00N2E0LWI1ZTYtZTAzZjc1' +
      'YjY2Yjg4IiwiaWF0IjoxNTk5ODQwMjUxLCJuYmYiOjE1OTk4NDAyNTEsImV4cCI6MTU5OT' +
      'g2MTg1MSwiaXNzIjoiU29saWRhcml0eSIsImF1ZCI6IlNvbGlkYXJpdHkifQ.6wvJyvgQQg'
      + 'LqC7VN2TDdjD-_fbh33gOAkso2FeXwFSI';

RESTRequest1.Params[0].Value := 'Bearer ' +RequestBody;
RESTRequest1.Excecute;
  //Hasta aquí todo Bien//

//De esta manera no logro que funcione utilizando el componente FDMemTable en el parametro de salida AccesToken1 de tipo string para almacenarlo en variable
RequestBody := FDMemTableAccesToken1.AsString;//<--- de esta manera me manda el error antes mencionado.
RESTRequest1.Params[0].Value := 'Bearer ' +RequestBody;
RESTRequest1.Excecute;
//Error 401 no autorizado//

Gracias ante mano Casimiro.


saludos

novatoerick

novato_erick 12-09-2020 17:06:18

Resuelto
 
Casimiro Eureka.

Sabes el problema no estaba en las variables si no en el tamaño por defecto que tiene el componente:

Código Delphi [-]
//Aqui el problema en el tamaño asignado que me otorgó el componente
 FDMemTable.ParamByName('AccessToken').size := 500; //<-- el tipo de dato soporta más de 256 carácteres y es ilimitado el tipo de dato

//aquí la solución Cambiandolo a size 1000

FDMemTable.ParamByName('AccessToken').size := 1000; //Resuelto el problema

leer parte de tu sugerencia "Casimiro" en cuanto Unicode me dio una luz en el camino. bueno es parte de la poca experiencia que tengo en usar Recursos de API.

Saludos Fraternales;

novatoerick

Casimiro Notevi 12-09-2020 17:16:59

Me alegro de que lo hayas solucionado ^\||/


La franja horaria es GMT +2. Ahora son las 09:32:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi