sgcOpenAPI en cinco minutos

sgcOpenAPI es un generador de código, no un componente de la paleta. Lo apuntas a una especificación, escribe una unit de Pascal y llamas a esa unit desde tu proyecto. Esta página ejecuta el generador una vez y después hace una llamada real contra el cliente generado.

OpenAPI 3, JSON y YAML
Genera un cliente Delphi tipado o un stub de servidor
Solo Delphi, las respuestas tipadas requieren XE7 o posterior

No hay ningún componente que soltar

Es lo único que hay que entender antes de empezar. sgcOpenAPI no registra nada en la paleta del IDE y no incluye ningún paquete de tiempo de diseño. El flujo de trabajo es generar y después usar.

La herramienta

sgcOpenAPI.exe, que es a la vez un asistente gráfico y una línea de comandos. Lee una especificación y escribe un archivo .pas.

Lo que escribe

Una unit con una clase cliente descendiente de TsgcOpenAPI_Client, un método por operación, las clases de petición y respuesta, y una función GetOpenAPIClient que devuelve un singleton listo para usar.

Cómo lo llamas

Añade la unit generada a tu proyecto, ponla en la cláusula uses y llama a GetOpenAPIClient.YourOperation(...). El resultado es un objeto de respuesta que liberas cuando terminas con él.

Los paquetes

Se incluyen cinco paquetes de runtime con SDK precompilados para AWS, Azure, Google y Microsoft. Son para compilar, no para instalar, porque no hay ninguna página de paleta que añadir.

Requisitos y ediciones

La columna de edición es el define que controla el código, con la línea en la que se encuentra en el Source/sgcVer.inc propio del producto.

Qué Valor
IDE Delphi 7 hasta RAD Studio 13 para el código generado. Los objetos de respuesta tipados necesitan XE7 o posterior, y la demo incluida los protege con {$IF CompilerVersion >= 28.0}. Por debajo de eso el método generado devuelve una cadena simple.
C++Builder No es compatible para el cliente generado. SGC_HTTP_OPENAPI, que controla todo sgcHTTP_OpenAPI_Client.pas, se define dentro de un {$IFNDEF BCB} en la línea 702 del sgcVer.inc del producto, así que una compilación de C++Builder compila esa unit a nada.
Edición Las compilaciones de sgcOpenAPI están fijadas a los dos niveles más bajos. Las líneas 7 a 10 de su sgcVer.inc dicen {$IFDEF SGC_OPENAPI} seguido de {$UNDEF SGC_EDT_PRO}, {$UNDEF SGC_EDT_ENT} y {$UNDEF SGC_EDT_ALL}, dejando definidos Core y Standard. Los niveles comerciales dependen del número de puestos, no de las características.
Generación de servidor La misma compilación define SGC_HTTP_OPENAPI_SERVER en la línea 11, así que el generador puede emitir un stub de servidor además de un cliente. Pasa -s en la línea de comandos.
Plataformas No hay guarda de sistema operativo a nivel de unit. Los únicos condicionales dentro de la unit base del cliente generado son la habitual importación {$IFDEF MSWINDOWS} y los cambios de tipo del id de hilo, así que compilan Windows, macOS, Linux, Android e iOS.
Activación de licencia Si la máquina no se ha activado, pasa -user y -password en la línea de comandos, de lo contrario la ejecución termina con el código 2.

El generador acepta JSON y YAML, y lee ambos en local. Un documento Swagger 2.0 también se convierte a OpenAPI 3 en local. El conversor remoto es opcional, mediante -r, y sube tu especificación a un servidor de terceros, así que permanece desactivado salvo que lo pidas.

Instala y genera

No hay ningún paquete de tiempo de diseño que instalar, así que la instalación es más corta que en los otros productos.

1. Descomprime

Descomprime la descarga en una carpeta, llamada {$DIR} más abajo. Obtienes Demos\, Bin\ y Source\.

2. Ruta de biblioteca

Tools, Options, Library. Añade {$DIR}\Source para que se resuelvan las units generadas y la clase base del cliente. No hay nada que instalar en el IDE.

3. Opcional, compila un SDK precompilado

Si quieres uno de los SDK incluidos, abre el paquete de runtime correspondiente en {$DIR}\Packages\ y compílalo. Son paquetes de runtime, así que se compilan en lugar de instalarse.

4. Genera un cliente

Ejecuta Bin\sgcOpenAPI.exe para el asistente, o usa la línea de comandos. Una entrada, una salida y tienes una unit.

5. Añade la unit a tu proyecto

Pon el .pas generado junto a tus otras units, añádelo al proyecto y ponlo en tu cláusula uses. Esa es toda la integración.

Entra una especificación, sale un cliente funcional

Una línea de comandos genera la unit. Una llamada la usa. La tercera pestaña muestra los parámetros que conviene conocer el primer día.

command line
> sgcOpenAPI.exe -i "geolocation.json" -o "geolocation.pas"

File successfully created geolocation.pas

Ambos parámetros son obligatorios. -i acepta un archivo local o una URL, y admite JSON y YAML, y -o es la unit de Pascal que se escribe. Hay un asistente gráfico en el mismo ejecutable si prefieres hacer clic. Añade el .pas generado a tu proyecto y ya está listo para usar.

fGeolocation.pas
uses
  geolocation;   // the unit you just generated

procedure TfrmGeolocation.btnGeolocationClick(Sender: TObject);
var
  oResponse: TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response;
begin
  oResponse := GetOpenAPIClient.Retrieve_the_location_of_an_IP_address(
    txtAPIKey.Text, txtIPAddress.Text);
  try
    if oResponse.IsSuccessful then
      memoResponse.Lines.Text :=
        'country: ' + oResponse.Successful.Country + #13#10 +
        'city: ' + oResponse.Successful.City
    else
      memoResponse.Lines.Text := oResponse.ResponseError;
  finally
    oResponse.Free;
  end;
end;

GetOpenAPIClient se genera en la unit y no recibe parámetros. Un método por operación, con el nombre tomado del id de operación. El objeto de respuesta lo liberas tú, y por eso la demo usa un try finally. En versiones de Delphi anteriores a XE7 el método generado devuelve en su lugar una cadena simple, y la demo incluida protege la ruta tipada con {$IF CompilerVersion >= 28.0}.

command line
-s              generate a server stub instead of a client
-a 3            add an OAuth2 flow to the generated client
                (0 none, 1 basic, 2 token, 3 oauth2, 4 jwt)
-u <url>        set the base url the generated client uses
-m 1            name methods from summary rather than operationid
                (0 operationid, 1 summary, 2 endpoint)
-x <list|file>  exclude operations, as "VERB endpoint"
-p              generate only the classes the kept operations use
-nc             do not create pascal classes
-l              show progress messages (errors are always shown)
-user -password activate the licence on this machine

En una especificación grande, -x y -p juntos son la diferencia entre una unit que puedes abrir en el IDE y una que no. También existe -r, y está desactivado por defecto a propósito porque sube toda la especificación a un conversor de terceros.

El comando de generación es la línea de uso que imprime la propia ayuda de la herramienta. La llamada es la demo incluida Demos\20.Client\abstractapi.com\geolocation\fGeolocation.pas, con los controles del formulario sustituidos por literales. Esa demo incluye la especificación y espera que generes la unit, y por eso el inicio rápido empieza por el generador.

Comprueba que el generador funcionó

Dos cosas que mirar, y una de ellas se puede automatizar.

El mensaje

La herramienta imprime File successfully created seguido de la ruta de salida. Los errores siempre van a la salida de error estándar, así que una ejecución silenciosa que no escribió nada no es muda.

El código de salida

0 éxito, 1 error, 2 licencia no válida, 3 parámetro no válido, 4 archivo de configuración no válido, 5 archivo de entrada no válido, 6 archivo de salida no válido, 7 la especificación no se pudo convertir a un documento OpenAPI 3 válido. Compruébalo en tu script de compilación.

La unit compila

Añade el .pas generado al proyecto y compila. Debería compilar sin más que {$DIR}\Source en la ruta de biblioteca.

IsSuccessful

En tiempo de ejecución te lo dice el objeto de respuesta. Cuando es falso, ResponseError lleva el mensaje y ResponseCode el estado HTTP.

Lo que suele fallar la primera vez

Seis problemas explican casi todas las primeras ejecuciones.

Estás buscando un componente en la paleta

No hay ninguno. sgcOpenAPI no registra componentes y no incluye ningún paquete de tiempo de diseño. La unit generada es el punto de integración, y GetOpenAPIClient es la forma de llegar al cliente.

La unit que nombra la demo no existe

Es lo esperado. Las demos incluyen la especificación y no la unit generada, así que primero ejecutas el generador. La demo de geolocalización necesita una unit llamada geolocation, que sale de geolocation.json.

Código de salida 2

La licencia no se ha activado en esta máquina. Pasa -user y -password en la línea de comandos.

El objeto de respuesta tipado no compila

Las respuestas tipadas necesitan XE7 o posterior. La demo incluida las protege con {$IF CompilerVersion >= 28.0} y recurre a un método que devuelve una cadena simple en compiladores más antiguos. Mantén esa guarda si das soporte a Delphi 7.

Nada compila en C++Builder

SGC_HTTP_OPENAPI se define dentro de un {$IFNDEF BCB} en la línea 702 del sgcVer.inc del producto, así que la clase base del cliente generado no se compila en absoluto para C++Builder.

La especificación no se convierte

El código de salida 7 significa que el documento no se pudo convertir en un documento OpenAPI 3 válido. YAML y Swagger 2.0 se gestionan en local; el conversor remoto que hay detrás de -r es la salida de emergencia, y sube el archivo completo a un servidor que eSeGeCe no controla.

Más allá del primer cliente

Cuatro direcciones, todas desde el mismo generador.

Genera un servidor, no un cliente

Pasa -s y el generador emite un stub de servidor en su lugar. Las demos de servidor muestran cómo se despachan las operaciones emitidas y cómo se validan contra la especificación.

sgcOpenAPI Server

Usa los SDK precompilados

Más de mil especificaciones ya están generadas e incluidas, entre ellas AWS, Azure, Google y Microsoft. Compila el paquete que quieras y sáltate por completo el paso de generación.

Las APIs incluidas

Recorta lo que generas

-x excluye operaciones por verbo y endpoint, y -p poda las clases que ninguna operación restante usa. En una especificación grande es la diferencia entre una unit que puedes abrir y una que no.

El parser

Conecta la autenticación

El cliente generado lleva una propiedad Authentication, y -a elige el esquema en el momento de la generación: ninguno, basic, token, OAuth2 o JWT.

Características de sgcOpenAPI

Referencia, demos y documentación

Los proyectos de demo se incluyen dentro de la descarga, en Demos\: SDK precompilados, un cliente generado y dos ejemplos de servidor.

Qué hace sgcOpenAPI El parser, el generador y el componente de servidor en una sola página.
El parser Cómo se lee, valida y convierte una especificación en tipos de Pascal.
El componente de servidor Servir una API a partir de una especificación en lugar de consumir una.
APIs incluidas Los SDK precompilados que se distribuyen listos para compilar.
Descarga la versión de prueba El generador y el código fuente, con límite de tiempo.
Qué es OpenAPI Contexto, si el propio formato de la especificación es nuevo para ti.

Lecturas relacionadas: generar un cliente Delphi desde OpenAPI, empaquetar esquemas, sgcOpenAPI frente a swagger-codegen y el servidor OpenAPI. Cada producto tiene su propio inicio rápido, listado en la página de primeros pasos.

Preguntas sobre el inicio rápido de sgcOpenAPI

Ninguno. sgcOpenAPI es un generador de código y una biblioteca de runtime, y no registra nada en la paleta del IDE. El producto no tiene ningún paquete de tiempo de diseño. Ejecutas sgcOpenAPI.exe contra una especificación, escribe una unit de Pascal y añades esa unit a tu proyecto. Dentro de ella, GetOpenAPIClient devuelve un objeto cliente listo para usar con un método por operación.
La herramienta la imprime en su propia ayuda: sgcOpenAPI.exe -i "c:\openapi.json" -o "c:\openapi.pas". Ambos parámetros son obligatorios. -i acepta un archivo local o una URL, y se admiten tanto JSON como YAML. -o es la unit de Pascal que se escribe. También se puede añadir un valor después de dos puntos, como en -i:"c:\openapi.json".
De dos maneras. La herramienta imprime File successfully created seguido de la ruta de salida, y establece un código de salida que puedes comprobar en un script de compilación. Los códigos son 0 éxito, 1 error, 2 licencia no válida, 3 parámetro no válido, 4 archivo de configuración no válido, 5 archivo de entrada no válido, 6 archivo de salida no válido y 7 la especificación no se pudo convertir a un documento OpenAPI 3 válido. Los errores siempre van a la salida de error estándar.
El método generado devuelve un objeto de respuesta descendiente de TsgcOpenAPIResponse. Lee primero IsSuccessful. Cuando es falso, ResponseError lleva el mensaje y ResponseCode el estado HTTP. Libera el objeto de respuesta cuando termines con él, que es lo que hace la demo incluida en un try finally.
El cliente generado no. SGC_HTTP_OPENAPI, que envuelve toda la interfaz de sgcHTTP_OpenAPI_Client.pas, se define dentro de un {$IFNDEF BCB} en la línea 702 del sgcVer.inc del producto, así que bajo C++Builder esa unit se compila a nada y el código generado no tiene clase base. Genera para Delphi.
El código generado se dirige a Delphi 7 y posteriores. Los objetos de respuesta tipados necesitan XE7 o posterior, y la demo incluida lo deja explícito con {$IF CompilerVersion >= 28.0}: por encima de esa línea obtienes un objeto de respuesta con campos tipados, por debajo el mismo método devuelve una cadena simple. Mantén la guarda si tu proyecto tiene que compilar en ambos.
Sí. Pasa -s y el generador emite un stub de servidor con atributos code-first en lugar de un cliente. La compilación que se distribuye como sgcOpenAPI define SGC_HTTP_OPENAPI_SERVER en la línea 11 de su sgcVer.inc, así que la parte de servidor está presente en todas las licencias. Se incluyen dos demos de servidor en Demos\30.Server.
No, salvo que lo pidas. YAML se lee en local, y un documento Swagger 2.0 se convierte a OpenAPI 3 en local. El parámetro -r, desactivado por defecto, permite recurrir al conversor público de converter.swagger.io, y el texto de ayuda dice claramente que eso sube el archivo completo a un servidor que eSeGeCe no controla. Déjalo desactivado para cualquier cosa confidencial.
La mejor opción: All-AccessTodos los productos de eSeGeCe, con Premium Support incluido, desde €1,059 al año.
Ver precios de All-Access

¿Listo para dejar de escribir clientes REST a mano?

Descarga la versión de prueba y genera un cliente a partir de una especificación que ya tengas.