Ik ben verheugd de sgcOpenAPI Pascal-parser aan te kondigen, een gloednieuw product waarmee je een OpenAPI-specificatie kunt importeren en een Pascal-interface kunt genereren. De sgcOpenAPI-parser ondersteunt de volgende specificaties:
- OpenAPI 3.*
- Swagger 2.* (automatisch geconverteerd van 2.0 naar 3.0)
- Swagger 1.* (automatisch geconverteerd van 1.0 naar 3.0)
Ondersteunt de volgende authenticaties:
- Basic
- Bearer Token
- OAuth2
- JWT
OpenAPI-parser
Een OpenAPI-parser is een tool die wordt gebruikt voor het parseren en valideren van OpenAPI-specificaties. OpenAPI is een specificatie voor het bouwen van API's die een standaard taalonafhankelijke interface definieert voor RESTful webservices.
De OpenAPI-parser leest OpenAPI-documenten geschreven in JSON- of YAML-formaat en zorgt ervoor dat ze voldoen aan de regels en richtlijnen van de specificatie. Dit omvat het controleren of het document alle vereiste velden bevat, geldige datatypes heeft en voldoet aan de verwachte structuur.
Naast het valideren van de syntaxis van het OpenAPI-document kan de parser ook worden gebruikt om code te genereren vanuit de specificatie, waardoor het eenvoudiger wordt om de API te implementeren in verschillende programmeertalen.
Over het algemeen helpt de OpenAPI-parser ervoor te zorgen dat API's worden gebouwd volgens de OpenAPI-specificatie, wat de interoperabiliteit tussen verschillende API's kan verbeteren en het voor ontwikkelaars eenvoudiger maakt om ze te consumeren en integreren.
Nu kun je de sgcOpenAPI-parser gebruiken om elke OpenAPI-specificatie te importeren en de vereiste Delphi/Pascal-interface-methoden te genereren om met de API te interacteren.
OpenAPI-specificatie
Hieronder vind je een voorbeeld van een OpenAPI-specificatie die wordt gebruikt om informatie op te halen voor een IP-adres
{
"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"
}
}
}
}
De sgcOpenAPI-parser leest de specificatie en maakt automatisch alle vereiste klassen, methoden enz. aan om met de klasse te interacteren. Hieronder vind je de interface die op basis van de voorgaande specificatie is aangemaakt.
{ ***************************************************************************
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
Zodra je de Pascal-interface hebt, is het heel eenvoudig om met de API te interacteren; zie hieronder een eenvoudig voorbeeld geschreven in 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;
Hieronder vind je een link naar de sgcOpenAPI Parser Trial
