Parser OpenAPI en Delphi

· Características

Me complace anunciar el sgcOpenAPI Pascal Parser, un producto totalmente nuevo que permite importar una OpenAPI Specification y generar una interfaz Pascal. El sgcOpenAPI Parser admite las siguientes especificaciones:


Admite las siguientes autenticaciones:

OpenAPI Parser

Un OpenAPI Parser es una herramienta utilizada para parsear y validar especificaciones OpenAPI. OpenAPI es una especificación para construir APIs que define una interfaz estándar e independiente del lenguaje para servicios web RESTful.

El OpenAPI Parser lee documentos OpenAPI escritos en formato JSON o YAML y asegura que se ajustan a las reglas y guías de la especificación. Esto incluye comprobar que el documento contiene todos los campos requeridos, tiene tipos de datos válidos y se ajusta a la estructura esperada.


Además de validar la sintaxis del documento OpenAPI, el parser también puede usarse para generar código a partir de la especificación, facilitando la implementación de la API en distintos lenguajes de programación.

En conjunto, el OpenAPI Parser ayuda a asegurar que las APIs se construyen según la especificación OpenAPI, lo que mejora la interoperabilidad entre distintas APIs y facilita a los desarrolladores consumirlas e integrarlas. 

Ahora puedes usar el sgcOpenAPI Parser para importar cualquier OpenAPI Specification y generar los métodos de la interfaz Delphi / Pascal necesarios para interactuar con la API.

OpenAPI Specification

A continuación encontrarás un ejemplo de OpenAPI Specification usada para obtener información dada una dirección IP 

{
  "openapi": "3.0.1",
  "servers": [
    {
      "url": "https://ipgeolocation.abstractapi.com"
    }
  ],
  "info": {
    "description": "Abstract IP geolocation API allows developers to retrieve the region, country and city behind any IP worldwide. The API covers the geolocation of IPv4 and IPv6 addresses in 180+ countries worldwide. Extra information can be retrieved like the currency, flag or language associated to an IP.",
    "title": "IP geolocation API",
    "version": "1.0.0",
    "x-apisguru-categories": [
      "location"
    ],
    "x-logo": {
      "url": "https://api.apis.guru/v2/cache/logo/https_global-uploads.webflow.com_5ebbd0a566a3996636e55959_5ec2ba29feeeb05d69160e7b_webclip.png"
    },
    "x-origin": [
      {
        "format": "openapi",
        "url": "https://documentation.abstractapi.com/ip-geolocation-openapi.json",
        "version": "3.0"
      }
    ],
    "x-providerName": "abstractapi.com",
    "x-serviceName": "geolocation"
  },
  "externalDocs": {
    "description": "API Documentation",
    "url": "https://www.abstractapi.com/ip-geolocation-api#docs"
  },
  "paths": {
    "/v1/": {
      "get": {
        "description": "Retrieve the location of an IP address",
        "parameters": [
          {
            "explode": true,
            "in": "query",
            "name": "api_key",
            "required": true,
            "schema": {
              "type": "string"
            },
            "style": "form"
          },
          {
            "explode": true,
            "in": "query",
            "name": "ip_address",
            "required": false,
            "schema": {
              "example": "195.154.25.40",
              "type": "string"
            },
            "style": "form"
          },
          {
            "explode": true,
            "in": "query",
            "name": "fields",
            "required": false,
            "schema": {
              "example": "country,city,timezone",
              "type": "string"
            },
            "style": "form"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "examples": {
                  "0": {
                    "value": "{\"ip_address\":\"195.154.25.40\",\"city\":\"Paris\",\"city_geoname_id\":2988507,\"region\":\"Île-de-France\",\"region_iso_code\":\"IDF\",\"region_geoname_id\":3012874,\"postal_code\":\"75008\",\"country\":\"France\",\"country_code\":\"FR\",\"country_geoname_id\":3017382,\"country_is_eu\":true,\"continent\":\"Europe\",\"continent_code\":\"EU\",\"continent_geoname_id\":6255148,\"longitude\":2.4075,\"latitude\":48.8323,\"security\":{\"is_vpn\":false},\"timezone\":{\"name\":\"Europe/Paris\",\"abbreviation\":\"CEST\",\"gmt_offset\":2,\"current_time\":\"15:42:18\",\"is_dst\":true},\"flag\":{\"emoji\":\"<ë<÷\",\"unicode\":\"U+1F1EB U+1F1F7\",\"png\":\"https://static.abstractapi.com/country-flags/FR_flag.png\",\"svg\":\"https://static.abstractapi.com/country-flags/FR_flag.svg\"},\"currency\":{\"currency_name\":\"Euros\",\"currency_code\":\"EUR\"},\"connection\":{\"autonomous_system_number\":12876,\"autonomous_system_organization\":\"Online S.a.s.\",\"connection_type\":\"Corporate\",\"isp_name\":\"Online S.A.S.\",\"organization_name\":\"ONLINE\"}}"
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/inline_response_200"
                }
              }
            },
            "description": "Location of geolocated IP"
          }
        },
        "servers": [
          {
            "url": "https://ipgeolocation.abstractapi.com"
          }
        ]
      },
      "servers": [
        {
          "url": "https://ipgeolocation.abstractapi.com"
        }
      ]
    }
  },
  "components": {
    "schemas": {
      "inline_response_200": {
        "properties": {
          "city": {
            "type": "string"
          },
          "city_geoname_id": {
            "type": "integer"
          },
          "connection": {
            "properties": {
              "autonomous_system_number": {
                "type": "integer"
              },
              "autonomous_system_organization": {
                "type": "string"
              },
              "connection_type": {
                "type": "string"
              },
              "isp_name": {
                "type": "string"
              },
              "organization_name": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "continent": {
            "type": "string"
          },
          "continent_code": {
            "type": "string"
          },
          "continent_geoname_id": {
            "type": "integer"
          },
          "country": {
            "type": "string"
          },
          "country_code": {
            "type": "string"
          },
          "country_geoname_id": {
            "type": "integer"
          },
          "country_is_eu": {
            "type": "boolean"
          },
          "currency": {
            "properties": {
              "currency_code": {
                "type": "string"
              },
              "currency_name": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "flag": {
            "properties": {
              "emoji": {
                "type": "string"
              },
              "png": {
                "type": "string"
              },
              "svg": {
                "type": "string"
              },
              "unicode": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "ip_address": {
            "type": "string"
          },
          "latitude": {
            "type": "number"
          },
          "longitude": {
            "type": "number"
          },
          "postal_code": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "region_geoname_id": {
            "type": "integer"
          },
          "region_iso_code": {
            "type": "string"
          },
          "security": {
            "properties": {
              "is_vpn": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "timezone": {
            "properties": {
              "abbreviation": {
                "type": "string"
              },
              "current_time": {
                "type": "string"
              },
              "gmt_offset": {
                "type": "integer"
              },
              "is_dst": {
                "type": "boolean"
              },
              "name": {
                "type": "string"
              }
            },
            "type": "object"
          }
        },
        "type": "object"
      }
    }
  }
} 

El sgcOpenAPI Parser lee la especificación y crea automáticamente todas las clases, métodos... necesarios para interactuar con la clase. A continuación encontrarás la interfaz creada a partir de la especificación anterior. 

{ ***************************************************************************
  sgcOpenAPI component
  written by eSeGeCe
  copyright © 2023
  Web : http://www.esegece.com
  *************************************************************************** }
unit geolocation;
interface
{$IF DEFINED(VER280) OR DEFINED(VER290) OR DEFINED(VER300) OR DEFINED(VER310) OR DEFINED(VER320) OR DEFINED(VER330) OR DEFINED(VER340) OR DEFINED(VER350)}
{$DEFINE SGC_OPENAPI_JSON}
{$IFEND}
uses
  Classes, SysUtils,
  sgcHTTP_OpenAPI_Client;
Type
{$IFDEF SGC_OPENAPI_JSON}
  TsgcOpenAPI_inline_response_200_Class = class;
  TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response = class;
{$ELSE}
  TsgcOpenAPI_inline_response_200_Class = string;
  TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response = string;
{$ENDIF}
  sgcOpenAPI_geolocation = class(TsgcOpenAPI_Client)
  protected
    function _Retrieve_the_location_of_an_IP_address(aApi_key: string;
      aIp_address: string = ''; aFields: string = '';
      const aResponse: TsgcOpenAPIResponse = nil): string; virtual;
  public
    constructor Create(aOwner: TComponent); override;
  public
    procedure SetServer0();
  public
    function Retrieve_the_location_of_an_IP_address(aApi_key: string;
      aIp_address: string = ''; aFields: string = '')
      : TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response;
  end;
{$IFDEF SGC_OPENAPI_JSON}
  TsgcOpenAPI_inline_response_200_Class = class(TsgcOpenAPIClass)
  private
    Fcity: String;
    Fcity_geoname_id: Int64;
    Fconnection: String;
    Fcontinent: String;
    Fcontinent_code: String;
    Fcontinent_geoname_id: Int64;
    Fcountry: String;
    Fcountry_code: String;
    Fcountry_geoname_id: Int64;
    Fcountry_is_eu: Boolean;
    Fcurrency: String;
    Fflag: String;
    Fip_address: String;
    Flatitude: Extended;
    Flongitude: Extended;
    Fpostal_code: String;
    Fregion: String;
    Fregion_geoname_id: Int64;
    Fregion_iso_code: String;
    Fsecurity: String;
    Ftimezone: String;
  public
    class function Read(const aValue: string)
      : TsgcOpenAPI_inline_response_200_Class;
  public
    property City: String read Fcity write Fcity;
    property City_geoname_id: Int64 read Fcity_geoname_id
      write Fcity_geoname_id;
    property Connection: String read Fconnection write Fconnection;
    property Continent: String read Fcontinent write Fcontinent;
    property Continent_code: String read Fcontinent_code write Fcontinent_code;
    property Continent_geoname_id: Int64 read Fcontinent_geoname_id
      write Fcontinent_geoname_id;
    property Country: String read Fcountry write Fcountry;
    property Country_code: String read Fcountry_code write Fcountry_code;
    property Country_geoname_id: Int64 read Fcountry_geoname_id
      write Fcountry_geoname_id;
    property Country_is_eu: Boolean read Fcountry_is_eu write Fcountry_is_eu;
    property Currency: String read Fcurrency write Fcurrency;
    property Flag: String read Fflag write Fflag;
    property Ip_address: String read Fip_address write Fip_address;
    property Latitude: Extended read Flatitude write Flatitude;
    property Longitude: Extended read Flongitude write Flongitude;
    property Postal_code: String read Fpostal_code write Fpostal_code;
    property Region: String read Fregion write Fregion;
    property Region_geoname_id: Int64 read Fregion_geoname_id
      write Fregion_geoname_id;
    property Region_iso_code: String read Fregion_iso_code
      write Fregion_iso_code;
    property Security: String read Fsecurity write Fsecurity;
    property Timezone: String read Ftimezone write Ftimezone;
  end;
  TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response = class
    (TsgcOpenAPIResponse)
  private
    FSuccessful: TsgcOpenAPI_inline_response_200_Class;
  public
    destructor Destroy; override;
  public
    property Successful: TsgcOpenAPI_inline_response_200_Class read FSuccessful
      write FSuccessful;
  end;
{$ENDIF}
function GetOpenAPIClient: sgcOpenAPI_geolocation;
procedure FreeOpenAPIClient;
implementation 
Una vez que tienes la interfaz Pascal, es muy fácil empezar a interactuar con la API; a continuación encontrarás un ejemplo sencillo escrito en Delphi.
function GetCountry(const aApiKey, aIpAddress: string): string;
var
  oResponse: TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response;
begin
  oResponse := GetOpenAPIClient.Retrieve_the_location_of_an_IP_address(aApiKey, aIpAddress);
  Try
    if oResponse.IsSuccessful then
      result := oResponse.Successful.Country
    else
      raise Exception.Create(oResponse.ResponseError);
  Finally
    oResponse.Free;
  End;
end; 

A continuación encontrarás un enlace a la trial de sgcOpenAPI Parser

Trial de sgcOpenAPI Parser