Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   TjsonObject como parámetro SERVICIO REST (https://www.clubdelphi.com/foros/showthread.php?t=89226)

igentile 19-10-2015 22:37:31

TjsonObject como parámetro SERVICIO REST
 
Hola a todos!

Hace unos días me asignaron un proyecto en mi trabajo en el cual debo crear un servicio REST para que consuma otra empresa externa. He leído mucha teoría y documentación y la verdad que pese a ser novato en el tema me he desenvuelto bastante bien pero actualmente estoy trabado ya que necesito recibir como parámetro un TjsonObject en uno de mis métodos públicos.

No sé como se trabaja en Delphi en estos casos, ¿se recibe un string con formato Json? ¿se recibe un objecto de tipo TjsonObject? en la web encontré muchos ejemplos en donde se recibe uno o varios parámetros de tipo integer o string que luego en la URI son separados con "/" pero ningún ejemplo en donde se pase un objeto como parámetro.

He probado definir mi método esperando como parámetro un TjsonObject pero tengo problemas para invocarlo desde REST debugger ya que no me reconoce el parámetro enviado como un formato Tjson válido.

Qué me recomiendan hacer en estos casos? Cómo se aconseja trabajarlo?

Muchas gracias!!

p/d: Utilizo Delphi XE6

jhonny 20-10-2015 03:54:28

Hola, Bienvenid@ al club...

Debes crear el parámetro como TRESTRequestParameter y agregarlo a la lista (propiedad) Params del TRESTRequest, en su propiedad Value enviar el parametro como un objeto serializado en JSON... la petición debe hacerse por medio del método POST, cosa que se configura en la propiedad Method como rmPOST y listo.

Es bastante curioso porque precisamente hoy, estaba pensando en crear un articulo para este tema.

igentile 20-10-2015 14:06:44

Gracias por tu respuesta Jhonny!!

Lo que exponés entiendo que es para hacer la llamada desde el lado cliente, pero ¿cómo defino el método en el lado servidor? ¿El parámetro tiene que ser un TjsonObject?

A continuación copio la definición de mi método para explicar mejor lo que quiero resolver:

Código Delphi [-]
{$METHODINFO ON}
  API = class(TComponent)
  private
  public
    function UpdateMundo(param: TJSONObject):TJSONObject; //post --> crea recurso
    function AcceptMundo(param: TJSONObject):TJSONObject; //put --> modifica recurso
    function Mundo(key: integer):TJSONObject; //get --> obtiene recurso
  end;
{$METHODINFO OFF}

Sería genial si pudieras crear ese artículo, sería de gran ayuda para todos los que estamos iniciando en el tema!

Gracias!!

Neftali [Germán.Estévez] 20-10-2015 14:07:27

No comentas qué tipo de servidor
Si estás pensando en generar un Servidor windows, puedes buscar por internert y encontrarás varios ejemplos de cómo hacerlo (en Español y en Inglés). Incluso en la docwiki de embarcadero puedes encontrar informaciópn completa y paso a paso. Por ejemplo:

Tutorial: Using a REST DataSnap Server with an Application and FireDAC
En este documento explica la utilizaciñon de JSON

JSON Types for Server Methods in DataSnap 2010

Otro enfoque sería hacerlo en PHP y consummirlo igualmente desde un cliente (delphi o no), de esta manera.

jhonny 20-10-2015 15:11:31

Cita:

Empezado por igentile (Mensaje 498130)
Gracias por tu respuesta Jhonny!!

Lo que exponés entiendo que es para hacer la llamada desde el lado cliente, pero ¿cómo defino el método en el lado servidor? ¿El parámetro tiene que ser un TjsonObject?

A continuación copio la definición de mi método para explicar mejor lo que quiero resolver:

Código Delphi [-]
{$METHODINFO ON}
  API = class(TComponent)
  private
  public
    function UpdateMundo(param: TJSONObject):TJSONObject; //post --> crea recurso
    function AcceptMundo(param: TJSONObject):TJSONObject; //put --> modifica recurso
    function Mundo(key: integer):TJSONObject; //get --> obtiene recurso
  end;
{$METHODINFO OFF}

Sería genial si pudieras crear ese artículo, sería de gran ayuda para todos los que estamos iniciando en el tema!

Gracias!!

Hacerlo como índicas está bien, sería cuestión de usar el TJSONMarshal para "deserializar" (no estoy seguro de su traducción correcta) el objeto y usarlo como quieres, pero yo he notado que desde alguna versión hacia acá de Delphi, puedes usar la clase como tal en el parámetro y él solo se encarga de serializar yy hacer el proceso inverso necesario.

Por otro lado es bueno que veas los artículos que menciona Neftalí, apuesto que te darán ideas de cómo reutilizar muchas herramientas.

jhonny 06-11-2015 14:17:06

Bueno, lo dicho, quizá sirva de algo el siguiente tema al respecto http://purodelphi.com/2015/10/28/no-...jsonunmarshal/


La franja horaria es GMT +2. Ahora son las 22:23:19.

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