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 14-05-2020
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
API REST con problema en BODY

Estimados, espero me puedan ayudar.
Estoy utilizando Delphi XE5 para realizar consultas a una API REST, con los componentes RESTRequest, RESTClient, RESTResponse, RESTResponseDAtaSetAdapter y OAuth2Authenticator y todo va bien hasta que tengo que pasarle un texto en Body raw como sigue:

{
"auth": {
"pass": {
"rut": "12345678-0",
"clave": "123456"
}
}
}

Si consumo otros servicios publicados en la misma API, pero que no necesite el Body funciona de maravilla.

Alguien me puede ayudar con esto ??

Tengo la certeza que la API funciona bien, porque la he probado con la herramienta Postman.
Responder Con Cita
  #2  
Antiguo 14-05-2020
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Esto es lo que escribe el tutorial de la API:

Se debe enviar mediante POST un JSON con el objeto auth.pass que contendrá las credenciales.

{
"auth": {
"pass": {
"rut": "12345678-0",
"clave": "123456"
}}}


He intentado con esto, pero no resulta
Código Delphi [-]
RESTrequest1.ClearBody;
RESTrequest1.AddBody('{"auth": {"pass": {"rut": "12345678-0","clave": "123456"}}}', ctAPPLICATION_JSON);
RESTrequest1.Execute;

Favor alguna idea ???
Responder Con Cita
  #3  
Antiguo 16-05-2020
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Sigo intentado conectarme, pero no he podido.
He intentado conectarme con REST Debugger, pero no he podido ya que me arroja el error 401, pero si lo hago desde el mismo Delphi si puedo ya que aquí existe la característica "TokenType" del TOAuth2Authenticator, si se cambia esa característica al valor "ttBEARER" logras conectarte sin problema en aquellas consultas que no necesita Body Custom.

He generado el JSON con el siguiente código y lo he agregado al request, pero sigue sin funcionar.

Código PHP:
var
  
ObjObjConsObjIppTJSONObject;
 
begin
 
    ObjCons 
:= TJSONObject.Create;
    
ObjCons.AddPair('rut'TJsonString.Create('12345678-0'));
    
ObjCons.AddPair('clave'TJsonString.Create('prueba'));
 
    
ObjIpp := TJSONObject.Create;
    
ObjIpp.AddPair('pass',ObjCons);
 
    
Obj := TJSONObject.Create;
    
Obj.AddPair('auth',ObjIpp);
 
  
RESTrequest1.ClearBody;
  
RESTrequest1.AddBody(Obj);
  
RESTrequest1.Execute;
 
end
Que estaré haciendo mal ??
Será que esta característica (custom body) se agrega en otra parte ??

También he intentado esto, pero sigo con el mismo error 500 (Internal Server Error).
Código PHP:
var
  
ObjObjConsObjIppTJSONObject;
 
begin
 
    ObjCons 
:= TJSONObject.Create;
    
ObjCons.AddPair('rut'TJsonString.Create('12345678-0'));
    
ObjCons.AddPair('clave'TJsonString.Create('prueba'));
 
    
ObjIpp := TJSONObject.Create;
    
ObjIpp.AddPair('pass',ObjCons);
 
    
Obj := TJSONObject.Create;
    
Obj.AddPair('auth',ObjIpp);
 
 
   
RESTrequest1.Params.Clear;
   
RESTrequest1.Params.Add;
   
RESTrequest1.Params[0].ContentType := ctAPPLICATION_JSON;
   
RESTrequest1.Params[0].Kind := pkREQUESTBODY;
   
RESTrequest1.Params[0].Value := obj.ToString;
 
 
  
RESTrequest1.Execute;
 
end
Esta correcto la forma de armar el JSON ??
Favor su ayuda, llevo muchas horas sin lograr nada.

Les dejo la URL de la API LibreDTE.
https://documenter.getpostman.com/vi...version=latest
Responder Con Cita
  #4  
Antiguo 18-05-2020
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
No veo en la documentación cuál es la URL del "recurso" para la autenticación.

Si dice que la ruta base es: https://api.libredte.cl/api/v1/sii, pero hace falta el recurso. Algo como:

https://api.libredte.cl/api/v1/sii/Login

Por otro lado, no se porque hablas de Autenticación oAuth2, y por otro lado estas intentando la autenticación mediante rut/password.

No nos indicas si estas haciendo la autenticación via POST o GET... y no vemos a que URL estas haciendo la petición.

Cualquiera de las dos formas deberias poder hacerlo por el REST Debugger, que tambien permite enviar autenticaciones con token BEARER tipo oAuth2.

intenté la autenticación via REST Debugger y no es posible. La extensión de ejemplo que tiene para PHP parte del hecho que ya tienes un token, y no realiza autenticación.
Responder Con Cita
  #5  
Antiguo 18-05-2020
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Hola gatosoft y gracias por su respuesta.

Te cuento oAuth2 es para aytenticarse en la API con un token y rut y clave son las credenciales para el SII, lo cual debe ir en custom body.
He logrado conectarme y obtener respuesta de aquí, ya que no es necesario agregar nada en cuerpo, pero si es necesario autenticarme en la API con el token.

Código PHP:
curl --location --request GET 'https://api.libredte.cl/api/v1/sii/indicadores/uf/anual/2020' \
--
header 'Accept: application/json' 
Pero cuando intento consultar por esta me arroja un error interno del servidor, ya que no se como agregar las credenciales del SII en el cuerpo.

Código PHP:
curl --location --request POST 'https://api.libredte.cl/api/v1/sii/mipyme/recibidos/xml//96800570-7/33/20043280' \
--
header 'Accept: application/json' \
--
header 'Content-Type: application/json' \
--
data-raw '{
    "auth": {
        "pass": {
            "rut": "",
            "clave": ""
        }
    }
}

He intentado con los códigos escritos en respuesta anterior, pero no me ha resultado.
Favor su ayuda.
Responder Con Cita
  #6  
Antiguo 18-05-2020
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Ok, viendo la documentación, veo que no existe en realidad una autenticación por RUT-CLAVE... el API, ofrece la posibilidad de hacer peticiones y en el Body enviar las credenciales (mal, pero...)


bueno, tu dices que recibes un internal error, pero yo recibo, con la misma petición este mensaje 401 (UnAuthorized por estándar). El mensaje retornado es:

{"message":"Unauthenticated."}{
"message": "Server Error"
}

Esto quiere decir que si está llegando al server y está validando la petición y concluye que no estas autenticado....

Yo estoy enviando una petición post con un body asi:

{
"auth": {
"pass": {
"rut": "12345678-0",
"clave": "12345678"
}
}
}

La URL: https://api.libredte.cl/api/v1/sii/m.../33/20043280/1

Es posible que el mensaje llegue porque las credenciales no sean válidas y el error no sea claro en este sentido...

¿Lo estas intentando por PostMan?, ¿por el REST Tool de delphi?... seria bueno ver una foto de la peticiñon y del error..
Responder Con Cita
  #7  
Antiguo 19-05-2020
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Si he logrado conectarme sin problema con Postman.
Agrega este token y veras que te funciona.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiMWNhNjE2OTZmNWYzNTU3YzQ0YmVlYzVjZGQ2ZDE zYTMxYmNiMDc0YzNhOWY4NmZlMjIyZjAwN2U3NmQyOTkyNTFjMTRmMGU2MmVmNWE0ZDgiLCJpYXQiOjE1ODk1OTY0OTcsIm5iZiI 6MTU4OTU5NjQ5NywiZXhwIjoxNjIxMTMyNDk3LCJzdWIiOiIxMTQiLCJzY29wZXMiOltdfQ.kYi4q8IjmtwXFhnvUCiniDgwP4ts 6VHphYHDHTEbAzD5vmYwZi9fF5o55lMLtPqUovoQKIDQHB3vT-tU4PpC_AJH2Ea65tKq4wgHVHWyXkCKuWST0-hC-anAOrMpTJsO45Pcuye5kLgHndZExVwe-XegrgsPEw2AYWNmMra7EagnMQfBwzXyE6EDk6Ql9gZPG07GtQp7FGEWWR04EScFbotuygT8eXgbfRDNwwpONQ0IjeBIhkfRPrMIh qmr3X1myosNzJ-WOiFTCTjSOrqNLW-MJ-riZDJcB93OGKI43KyvB4ng0_-4qz5PnJlf1snSbNUVlKqNeseWXQmCGPW1wSrDP_WKzSUmAHz_ySGJD7XFYX155VBRuy9JJW2CVsv4zGFUgwErsNiXzQSUGaghtsE qz9_AhxsKXOeyJgLPlcSPEO6oEGg73KGkcCEH1Kj9FI5r0jy1IzPW4nreBIoilMgGp4PvjzE_voekgd9xN-ypz3FSGmSdN073ceBpGze9-Hasj7gMsGxoqgaen5DkPCNLDX5xmTv7gSn2ViEV-lhs503PheQ_WmukugEqsikrlPah3tOmQqUnHlV2mFBvzzUolN055tJcSacXTjqsZKcTbFBzXcWLHSnCtF0wWx57Doyt_Tkk-JwQ2Atedy3m3_oI4zYFHhOxUJMLM7CmE7o

En el componente TOAuth2Authenticator, cambia la propiedad de TokenTypo por ttBEARER y podrás hacer consultas que no requieran nada en el cuerpo, por ejemplo:

GET https://api.libredte.cl/api/v1/sii/i.../uf/anual/2020

El problema surge cuando necesito agregar en el cuerpo las credenciales del SII, aquí es cuando me arroja el error interno, por ejemplo:

POST https://api.libredte.cl/api/v1/sii/r...ertificacion=0

Como agrego al cuerpo JSON requerido ??

Código PHP:
{
"auth": {
"pass": {
"rut""12345678-0",
"clave""12345678"
}
}

Este código no resulta

Código Delphi [-]
var
  Obj, ObjCons, ObjIpp: TJSONObject;
 
begin
 
    ObjCons := TJSONObject.Create;
    ObjCons.AddPair('rut', TJsonString.Create('12345678-0'));
    ObjCons.AddPair('clave', TJsonString.Create('prueba'));
 
    ObjIpp := TJSONObject.Create;
    ObjIpp.AddPair('pass',ObjCons);
 
    Obj := TJSONObject.Create;
    Obj.AddPair('auth',ObjIpp);
 
  RESTrequest1.ClearBody;
  RESTrequest1.AddBody(Obj);
  RESTrequest1.Execute;
 
end;

Ni tampoco este:

Código Delphi [-]
var
  Obj, ObjCons, ObjIpp: TJSONObject;
 
begin
 
    ObjCons := TJSONObject.Create;
    ObjCons.AddPair('rut', TJsonString.Create('12345678-0'));
    ObjCons.AddPair('clave', TJsonString.Create('prueba'));
 
    ObjIpp := TJSONObject.Create;
    ObjIpp.AddPair('pass',ObjCons);
 
    Obj := TJSONObject.Create;
    Obj.AddPair('auth',ObjIpp);
 
 
   RESTrequest1.Params.Clear;
   RESTrequest1.Params.Add;
   RESTrequest1.Params[0].ContentType := ctAPPLICATION_JSON;
   RESTrequest1.Params[0].Kind := pkREQUESTBODY;
   RESTrequest1.Params[0].Value := obj.ToString;
 
 
  RESTrequest1.Execute;
 
end;

No estoy muy instruido en JSON, está bien generado con los códigos que escribo ??
Espero me puedan ayudar !!
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
¿como recibo el body cuerpo y adjuntos de un mail IMAP server ?? JXJ Varios 1 14-05-2019 00:05:21
Error Al Obtener el Body de correos electronicos con Indy9 Enan0 Internet 1 27-01-2010 15:59:43
Salto de linea en el body de un email kverna Internet 5 28-01-2008 13:22:00
AnsiString en body de MAPI intruder Varios 1 17-12-2007 19:28:36
indy. POP. Recuperar BODY jorodgar Servers 1 19-04-2005 12:01:28


La franja horaria es GMT +2. Ahora son las 06:52:08.


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