OpenAPI Delphi 解析器

· 功能

很高兴宣布推出 sgcOpenAPI Pascal 解析器,这是一款全新产品,可导入 OpenAPI 规范并生成 Pascal 接口。sgcOpenAPI 解析器支持以下规范:


支持以下身份验证方式:

OpenAPI 解析器

OpenAPI 解析器是用于解析和验证 OpenAPI 规范的工具。OpenAPI 是构建 API 的规范,为 RESTful Web 服务定义了与语言无关的标准接口。

OpenAPI 解析器读取以 JSON 或 YAML 格式编写的 OpenAPI 文档,并确保它们遵循规范的规则和指南。这包括检查文档是否包含所有必需字段、具有有效的数据类型以及符合预期结构。

除了验证 OpenAPI 文档的语法外,解析器还可用于从规范生成代码,使在不同编程语言中实现 API 变得更加容易。

总体而言,OpenAPI 解析器有助于确保 API 按照 OpenAPI 规范构建,从而提高不同 API 之间的互操作性,使开发者更容易使用和集成它们。

现在,您可以使用 sgcOpenAPI 解析器导入任何 OpenAPI 规范,并生成与 API 交互所需的 Delphi/Pascal 接口方法。

OpenAPI 规范

以下是用于获取 IP 地址信息的 OpenAPI 规范示例:

{
  "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"
      }
    }
  }
} 

sgcOpenAPI 解析器读取规范并自动创建与类交互所需的所有类和方法……以下是根据上述规范创建的接口。

{ ***************************************************************************
  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 
获得 Pascal 接口后,开始与 API 交互非常简单,以下是用 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; 

以下是 sgcOpenAPI Parser Trial 的链接:

sgcOpenAPI Parser Trial