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:
- OpenAPI 3.*
- Swagger 2.* (convertido automáticamente de 2.0 a 3.0)
- Swagger 1.* (convertido automáticamente de 1.0 a 3.0)
Admite las siguientes autenticaciones:
- Basic
- Bearer Token
- OAuth2
- JWT
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
