Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Delphi para la web
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-09-2020
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 11-09-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No se ve en el código que has puesto, pero RequestBody seguramente es unicode y VariableDirectaTabla veo que es ansistring.
Responder Con Cita
  #3  
Antiguo 12-09-2020
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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..
Responder Con Cita
  #4  
Antiguo 12-09-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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?
Responder Con Cita
  #5  
Antiguo 12-09-2020
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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
Responder Con Cita
  #6  
Antiguo 12-09-2020
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 12-09-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Me alegro de que lo hayas solucionado
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Variable de Tipo ruedabeat2003 Varios 2 21-12-2011 02:24:58
No se puede convertir variable de tipo null a tipo integer. JairoC Varios 5 30-11-2011 15:43:11
Averiguar tipo de una variable senda Varios 3 12-07-2007 06:58:49
Tipo de Variable gabriel3 Varios 5 13-01-2006 20:46:55
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51


La franja horaria es GMT +2. Ahora son las 11:17:36.


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
Copyright 1996-2007 Club Delphi