Parser OpenAPI para Delphi

· Recursos

Tenho o prazer de anunciar o sgcOpenAPI Pascal Parser, um produto totalmente novo que permite importar uma Especificação OpenAPI e gerar uma Interface Pascal. O sgcOpenAPI Parser suporta as seguintes especificações:


Suporta as seguintes autenticações:

Parser OpenAPI

Um OpenAPI Parser é uma ferramenta usada para analisar e validar especificações OpenAPI. O OpenAPI é uma especificação para construção de APIs que define uma interface padrão independente de linguagem para serviços web RESTful.

O OpenAPI Parser lê documentos OpenAPI escritos em formato JSON ou YAML e garante que eles sigam as regras e diretrizes da especificação. Isso inclui verificar se o documento contém todos os campos obrigatórios, possui tipos de dados válidos e está em conformidade com a estrutura esperada.


Além de validar a sintaxe do documento OpenAPI, o parser também pode ser usado para gerar código a partir da especificação, facilitando a implementação da API em diferentes linguagens de programação.

No geral, o OpenAPI Parser ajuda a garantir que as APIs sejam construídas de acordo com a especificação OpenAPI, o que pode melhorar a interoperabilidade entre diferentes APIs e facilitar o consumo e a integração por parte dos desenvolvedores. 

Agora você pode usar o sgcOpenAPI Parser para importar qualquer Especificação OpenAPI e gerar os métodos de interface Delphi/Pascal necessários para interagir com a API.

Especificação OpenAPI

Veja abaixo um exemplo de Especificação OpenAPI usada para obter informações a partir de um endereço 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"
      }
    }
  }
} 

O sgcOpenAPI Parser lê a especificação e cria automaticamente todas as classes, métodos... necessários para interagir com a API. Veja abaixo a interface criada a partir da especificação 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 
Depois de ter a interface Pascal, é muito fácil começar a interagir com a API. Veja abaixo um exemplo simples escrito em 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; 

Veja abaixo um link para o sgcOpenAPI Parser Trial

sgcOpenAPI Parser Trial