PDA

Ver la Versión Completa : variable tipo AnsiString para un Token


novato_erick
11-09-2020, 21:10:44
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:



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
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
---------------------------



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.



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/07/24/strings-unicode-en-delphi-parte-i/

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
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.


//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
Casimiro Eureka.

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


//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 ^\||/