Ir al contenido



Foto

Consumir REST con JSON en cuerpo


  • Por favor identifícate para responder
7 respuestas en este tema

#1 mjjjj

mjjjj

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 14 mayo 2020 - 07:08

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

 

He probado con esto, pero no resulta, el servidor sigue enviando mensaje de error interno.


php
  1. var
  2. vJSON : TJSONObject;
  3. vTxt : string;
  4. begin
  5.  
  6. vTxt :='{"auth": {"pass": {"rut": "12345678-0","clave": "prueba"}}}';
  7. vJSON := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(vTxt), 0) as TJSONObject;
  8.  
  9. RESTrequest1.ClearBody;
  10. RESTrequest1.AddBody(vJSON);
  11. RESTrequest1.Execute;
  12.  

Si consumo otros servicios publicados en la misma API, pero que no necesite el Body funciona de maravilla.
Tengo la certeza que la API funciona bien, porque la he probado con la herramienta Postman.

Alguien me puede ayudar con esto ??

 

Adjunto archivo con información adicional y pantallazos que pueden ser útiles para entender de mejor forma el problema.


Link de la documentación de la API:

https://documenter.g...?version=latest


  • 0

#2 mjjjj

mjjjj

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 14 mayo 2020 - 07:23

Agrego mayor información entregada por documentos de la API.

 

Variable en el cuerpo de la solicitud POST agregada como un diccionario de datos en JSON. Este tipo de variables se usará principalmente para:

  • Autenticación en SII.

 

La ruta base de todos estos servicios es:

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

Autenticación mediante RUT y Clave del SII

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


php
  1. {
  2. "auth": {
  3. "pass": {
  4. "rut": "",
  5. "clave": ""
  6. }
  7. }
  8. }

Adjunto un ejemplo para el listado de boletas de honorarios recibidas:

 


php
  1. curl --location --request POST 'https://api.libredte.cl/api/v1/sii/bhe/recibidas/documentos/76192083-9/202001?formato=json' \
  2. --header 'Accept: application/json' \
  3. --header 'Content-Type: application/json' \
  4. --data-raw '{
  5. "auth": {
  6. "pass": {
  7. "rut": "76192083-9",
  8. "clave": ""
  9. }
  10. }
  11. }
  12. '


  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.111 mensajes
  • LocationMéxico

Escrito 15 mayo 2020 - 05:34

Intenté hacerlo con REST Debugger pero tampoco se pudo, hay algo que falta en lo que se envía.

 

Tu puedes hacer la prueba con REST Debugger el cual se localiza en el directorio BIN de tu Delphi, una vez que lo tengas funcionando ya podemos solucionar el problema fácilmente copiando los objetos desde REST-Debugger a Delphi.

 

Saludos

 

Archivos adjuntos


  • 0

#4 mjjjj

mjjjj

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 15 mayo 2020 - 10:45

Hola Egostar, muchas gracias por tu tiempo e intentar ayudarme.

Te cuento que yo tampoco he podido conectarme con REST Debugger (me arroja el mismo error 401), pero si lo hago desde el mismo Delphi si puedo ya que aquí existe la característica "TokenType" del TOAuth2Authenticator, si cambias 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.


php
  1. var
  2. Obj, ObjCons, ObjIpp: TJSONObject;
  3.  
  4. begin
  5.  
  6. ObjCons := TJSONObject.Create;
  7. ObjCons.AddPair('rut', TJsonString.Create('12345678-0'));
  8. ObjCons.AddPair('clave', TJsonString.Create('prueba'));
  9.  
  10. ObjIpp := TJSONObject.Create;
  11. ObjIpp.AddPair('pass',ObjCons);
  12.  
  13. Obj := TJSONObject.Create;
  14. Obj.AddPair('auth',ObjIpp);
  15.  
  16. RESTrequest1.ClearBody;
  17. RESTrequest1.AddBody(Obj);
  18. RESTrequest1.Execute;
  19.  

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


php
  1. var
  2. Obj, ObjCons, ObjIpp: TJSONObject;
  3.  
  4. begin
  5.  
  6. ObjCons := TJSONObject.Create;
  7. ObjCons.AddPair('rut', TJsonString.Create('12345678-0'));
  8. ObjCons.AddPair('clave', TJsonString.Create('prueba'));
  9.  
  10. ObjIpp := TJSONObject.Create;
  11. ObjIpp.AddPair('pass',ObjCons);
  12.  
  13. Obj := TJSONObject.Create;
  14. Obj.AddPair('auth',ObjIpp);
  15.  
  16.  
  17. RESTrequest1.Params.Clear;
  18. RESTrequest1.Params.Add;
  19. RESTrequest1.Params[0].ContentType := ctAPPLICATION_JSON;
  20. RESTrequest1.Params[0].Kind := pkREQUESTBODY;
  21. RESTrequest1.Params[0].Value := obj.ToString;
  22.  
  23.  
  24. RESTrequest1.Execute;
  25.  

Esta correcto la forma de armar el JSON ??


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.111 mensajes
  • LocationMéxico

Escrito 18 mayo 2020 - 03:50

Hola Egostar, muchas gracias por tu tiempo e intentar ayudarme.

Te cuento que yo tampoco he podido conectarme con REST Debugger (me arroja el mismo error 401), pero si lo hago desde el mismo Delphi si puedo ya que aquí existe la característica "TokenType" del TOAuth2Authenticator, si cambias 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.

 

Hola mjjjj voy a leer la documentación para poder ayudarte mejor.

 

Saludos


  • 0

#6 mjjjj

mjjjj

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 18 mayo 2020 - 04:06

Gracias egostar, puedes utilizar este token para probar la conección.

 

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiMWNhNjE2OTZmNWYzNTU3YzQ0YmVlYzVjZGQ2ZDEzYTMxYmNiMDc0YzNhOWY4NmZlMjIyZjAwN2U3NmQyOTkyNTFjMTRmMGU2MmVmNWE0ZDgiLCJpYXQiOjE1ODk1OTY0OTcsIm5iZiI6MTU4OTU5NjQ5NywiZXhwIjoxNjIxMTMyNDk3LCJzdWIiOiIxMTQiLCJzY29wZXMiOltdfQ.kYi4q8IjmtwXFhnvUCiniDgwP4ts6VHphYHDHTEbAzD5vmYwZi9fF5o55lMLtPqUovoQKIDQHB3vT-tU4PpC_AJH2Ea65tKq4wgHVHWyXkCKuWST0-hC-anAOrMpTJsO45Pcuye5kLgHndZExVwe-XegrgsPEw2AYWNmMra7EagnMQfBwzXyE6EDk6Ql9gZPG07GtQp7FGEWWR04EScFbotuygT8eXgbfRDNwwpONQ0IjeBIhkfRPrMIhqmr3X1myosNzJ-WOiFTCTjSOrqNLW-MJ-riZDJcB93OGKI43KyvB4ng0_-4qz5PnJlf1snSbNUVlKqNeseWXQmCGPW1wSrDP_WKzSUmAHz_ySGJD7XFYX155VBRuy9JJW2CVsv4zGFUgwErsNiXzQSUGaghtsEqz9_AhxsKXOeyJgLPlcSPEO6oEGg73KGkcCEH1Kj9FI5r0jy1IzPW4nreBIoilMgGp4PvjzE_voekgd9xN-ypz3FSGmSdN073ceBpGze9-Hasj7gMsGxoqgaen5DkPCNLDX5xmTv7gSn2ViEV-lhs503PheQ_WmukugEqsikrlPah3tOmQqUnHlV2mFBvzzUolN055tJcSacXTjqsZKcTbFBzXcWLHSnCtF0wWx57Doyt_Tkk-JwQ2Atedy3m3_oI4zYFHhOxUJMLM7CmE7o

 

Verás que una consulta sin cuerpo funciona perfecto, por ejemplo

 

GET https://api.libredte..../uf/anual/2020


  • 1

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.111 mensajes
  • LocationMéxico

Escrito 20 mayo 2020 - 09:46

Necesito configurar el acceso vía OAUTH2 pero cual es el usuario para el token que mencionas .

 

Además de saber cual es el token de acceso y el token de request.

 

Saludos


  • 0

#8 mjjjj

mjjjj

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 20 mayo 2020 - 09:57

No necesitas usuario, solo completar el Access Token y TokenType" cambiarlo a "ttBEARER"

Prueba este token con la consulta GET https://api.libredte..../uf/anual/2020

 

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIxIiwianRpIjoiMWNhNjE2OTZmNWYzNTU3YzQ0YmVlYzVjZGQ2ZDEzYTMxYmNiMDc0YzNhOWY4NmZlMjIyZjAwN2U3NmQyOTkyNTFjMTRmMGU2MmVmNWE0ZDgiLCJpYXQiOjE1ODk1OTY0OTcsIm5iZiI6MTU4OTU5NjQ5NywiZXhwIjoxNjIxMTMyNDk3LCJzdWIiOiIxMTQiLCJzY29wZXMiOltdfQ.kYi4q8IjmtwXFhnvUCiniDgwP4ts6VHphYHDHTEbAzD5vmYwZi9fF5o55lMLtPqUovoQKIDQHB3vT-tU4PpC_AJH2Ea65tKq4wgHVHWyXkCKuWST0-hC-anAOrMpTJsO45Pcuye5kLgHndZExVwe-XegrgsPEw2AYWNmMra7EagnMQfBwzXyE6EDk6Ql9gZPG07GtQp7FGEWWR04EScFbotuygT8eXgbfRDNwwpONQ0IjeBIhkfRPrMIhqmr3X1myosNzJ-WOiFTCTjSOrqNLW-MJ-riZDJcB93OGKI43KyvB4ng0_-4qz5PnJlf1snSbNUVlKqNeseWXQmCGPW1wSrDP_WKzSUmAHz_ySGJD7XFYX155VBRuy9JJW2CVsv4zGFUgwErsNiXzQSUGaghtsEqz9_AhxsKXOeyJgLPlcSPEO6oEGg73KGkcCEH1Kj9FI5r0jy1IzPW4nreBIoilMgGp4PvjzE_voekgd9xN-ypz3FSGmSdN073ceBpGze9-Hasj7gMsGxoqgaen5DkPCNLDX5xmTv7gSn2ViEV-lhs503PheQ_WmukugEqsikrlPah3tOmQqUnHlV2mFBvzzUolN055tJcSacXTjqsZKcTbFBzXcWLHSnCtF0wWx57Doyt_Tkk-JwQ2Atedy3m3_oI4zYFHhOxUJMLM7CmE7o

 

Esto funciona en Postman y Delphi XE5, el problema es cuando necesito agregar un cuerpo al request.


  • 0