Ir al contenido


Foto

Consumir servicio REST


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

#1 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 28 agosto 2016 - 05:58

Hola amigos!

Escribo porque no logro consumir un servicio REST. Obtengo el mensaje 200 OK pero no logro obtener el JSON.

 

He arrastrado los siguientes componentes:

 

RESTRequestPadron

RESTClientPadron

RESTResponsePadron

RESTResponseDataSetAdapter

 

Ademas he asignado el client y el response al request. Al apretar "Execute" devuelve todo correcto.

 

He probado usar Rest Debugger de delphi. Y es lo mismo. No devuelve ningun contenido. sin embargo utilizando chrome si me aparecen los campos en json en pantalla.

 

Probe colocar un componente TMemo y utilizar el evento afterexecute, como se ve en el blog de neftali, y no devuelve nada.

 

No seque me falta realizar.

 

Gracias


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 agosto 2016 - 07:29

Sin ver tu JASON es complicado, pero intenta hacer una prueba con el siguiente REST Service

 

https://jsonplacehol...de.com/comments

 

Si puedes leerlo entonces el asunto va por otro lado.

 

Saludos

Archivos adjuntos

  • Archivo adjunto  REST.png   170,93KB   2 descargas

  • 1

#3 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 28 agosto 2016 - 08:19

Sin ver tu JASON es complicado, pero intenta hacer una prueba con el siguiente REST Service

 

https://jsonplacehol...de.com/comments

 

Si puedes leerlo entonces el asunto va por otro lado.

 

Saludos

de hecho me funciono con tu servicio.

 

En mi caso se trata del servicio de AFIP. Este devuelve el STATUS y la DATA, en json obviamente.

Se ve que retorna el STATUS ok pero no puedo acceder a los datos. Tambien observo un html pero vacio...

 

Si quito la propiedad Response del componente RESTRequest obtengo un Response content is not a valid json.


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 agosto 2016 - 05:24

de hecho me funciono con tu servicio.

 

En mi caso se trata del servicio de AFIP. Este devuelve el STATUS y la DATA, en json obviamente.

Se ve que retorna el STATUS ok pero no puedo acceder a los datos. Tambien observo un html pero vacio...

 

Si quito la propiedad Response del componente RESTRequest obtengo un Response content is not a valid json.

 

Hola

 

Pues solo que podamos acceder a ese servicio podriamos saber por donde van los tiros, 

 

Saludos


  • 0

#5 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 29 agosto 2016 - 04:08

Hola

 

Pues solo que podamos acceder a ese servicio podriamos saber por donde van los tiros, 

 

Saludos

Te entiendo totalmente. El amigo @agustin hizo una aplicacion que consume este servicio.

 

la documentacion te la adjunto.

 

Pero la parte que mas interesa es:

 

La API ofrece una serie de servicios o recursos URI con el siguiente formato:

 

https://dominio/sist...o/identificador

 

Ej: https://soa.afip.gob.ar/sr-padron/v2/persona/20123456789

 

Los servicios devuelven un HTTP Response con Status Code 200 (OK) con encoding UTF8 conteniendo un JSON que tiene el siguiente aspecto:

 

respuesta exitosa

{"success":true, "data":{datosDeNegocio}}

respuesta no exitosa

{"success":false,"error":{descripcionDelError}}

 

y los datos personales y del negocio.

 

Para mi el problema es que no debo utilizar la url completa, como se muestra en los tutoriales, tal vez debo usar parametros. Seguire investigando

Archivos adjuntos


  • 0

#6 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 02 septiembre 2016 - 12:00

Bueno al fin empece a utilizar los componentes NetHTTPRequest y NetHTTPClient.

 

Luego de obtener el response use system.json para parsear el resultado.

 

No soy muy estricto programando jeje, pero he creado una funcion para pasarle como parametro una cadena, ya que el servicio de AFIP tiene distintas URL's de acuerdo a lo que solicitemos:


delphi
  1. function ejecresquest(const recurso,version,tipoRecurso,idRecurso:string):string;
  2. var
  3. url,Nombre:string;
  4. obj,objitems:TJSONobject;
  5. objdata:TJSONObject;
  6. response:IHTTPResponse;
  7. NetHTTPRequestPADRON:TNetHTTPRequest;
  8. NetHTTPClientPADRON:TNetHTTPClient;
  9. begin
  10.  
  11. NetHTTPRequestPADRON:=TNetHTTPRequest.Create(nil);
  12. NetHTTPClientPADRON:=TNetHTTPClient.Create(nil);
  13. url:='https://soa.afip.gob.ar' + '/' + recurso + '/' + version + '/' + tipoRecurso + '/' + idRecurso;
  14. NetHTTPRequestPADRON.URL:=url;
  15. NetHTTPRequestPADRON.Client:=NetHTTPClientPADRON;
  16. obj := TJSONobject.Create();
  17.  
  18. try
  19. response:=NetHTTPRequestPADRON.Execute();
  20. obj:=TJSONObject.ParseJSONValue(response.ContentAsString()) as TJSONobject;
  21.  
  22. objdata :=obj.Values['data'] as TJSONObject;
  23. //todo lo que queramos
  24. ShowMessage(objdata.Values['nombre'].ToString);
  25. except
  26. on E:Exception do
  27. ShowMessage(E.ClassName + E.Message);
  28.  
  29.  
  30. end;

Cabe destacar que en la respuesta de AFIP, como en cualquier JSON, los elementos que empiezan con llaves deben ser tratados como objetos, y los que comienzan con corchetes como arrays. De acuerdo a esto es el tipo de "casteo" que debemos realizar.

 

Saludos.


  • 1

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 septiembre 2016 - 12:05

Bueno al fin empece a utilizar los componentes NetHTTPRequest y NetHTTPClient.

 

Luego de obtener el response use system.json para parsear el resultado.

 

:::::

 

No soy muy estricto programando jeje, pero he creado una funcion para pasarle como parametro una cadena, ya que el servicio de AFIP tiene distintas URL's de acuerdo a lo que solicitemos:

Cabe destacar que en la respuesta de AFIP, como en cualquier JSON, los elementos que empiezan con llaves deben ser tratados como objetos, y los que comienzan con corchetes como arrays. De acuerdo a esto es el tipo de "casteo" que debemos realizar.

 

Saludos.

 

Me parece que está bien abordado, tal vez se puede optimizar/mejorar, pero si obtienes lo que necesitas esta perfecto.

 

Gracias por compartirlo.

 

Saludos


  • 1

#8 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 02 septiembre 2016 - 05:16

Cuidado con los memory leaks!


  • 0

#9 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 03 septiembre 2016 - 03:10

Cuidado con los memory leaks!

em si, es un prototipo de codigo jej. Tu te refieres a que me falta liberar los objetos creados una vez treminado el proceso?

 

Muchas gracias..saludos


  • 0

#10 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 03 septiembre 2016 - 09:01

Exactamente, tanto los net http como los objetos json
  • 0

#11 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 03 septiembre 2016 - 10:31

Exactamente, tanto los net http como los objetos json

si de hecho habia pensado anidar dos try para meter en un finally los metodos Free. Asi como asignar los datos que vienen del JSON  a los  atributos de mi clase cliente..

 

Saludos


  • 0




IP.Board spam blocked by CleanTalk.