Генератор клиента OpenAPI для Delphi и FPC: обзор и альтернативное решение
Недавно Arnaud Bouchez анонсировал новый открытый генератор клиента OpenAPI для Delphi и FPC. В этой статье мы рассмотрим ключевые особенности этого генератора, а также предложим альтернативное решение для тех, кто ищет другие варианты генерации клиента OpenAPI в Delphi и Pascal.
Генератор OpenAPI клиента от Arnaud Bouchez
Арnaud Bouchez разработал генератор OpenAPI клиента, который является полностью открытым исходным кодом tanto для генератора, quanto для сгенерированного кода. Ниже приведены некоторые ключевые особенности этого генератора:
Высокоуровневые типы данных: Генератор использует высокоуровневые типы данных Pascal, такие как записи и динамические массивы, для представления объектов DTO и перечислений.
Исключения: Ошибки HTTP-статуса переводятся в высокоуровневые исключения Pascal.
Реузинг типов: Генератор распознает похожие свойства или перечисления и переиспользует тот же тип Pascal.
Поддержка атрибутов OpenAPI: Генератор поддерживает атрибуты OpenAPI, такие как "$ref", "allOf" и "oneOf".
Комментарии и документация: Сгенерированный код содержит подробные комментарии и документацию.
Настраиваемый генератор: Генератор имеет множество параметров настройки для управления детализацией и поведением генерации.
Хотя этот генератор имеет множество полезных функций, он все еще не полностью совместим со всеми существующими файлами OpenAPI, и разработчики приветствуют обратную связь для усовершенствования генератора.
Альтернативное решение: Swagger Codegen
Swagger Codegen — это популярный генератор клиентов и серверов для OpenAPI (ранее известный как Swagger). Он поддерживает множество языков программирования, в том числе Object Pascal (Delphi). Swagger Codegen имеет широкий спектр функций, таких как:
Поддержка различных языков: Swagger Codegen поддерживает более 30 языков программирования, включая Object Pascal, что делает его гибким выбором для проектов, использующих разные языки.
Настраиваемый генератор: Как и генератор от Arnaud Bouchez, Swagger Codegen имеет множество параметров настройки для управления поведением генерации.
Комментарии и документация: Сгенерированный код содержит подробные комментарии и документацию, что облегчает понимание и отладку.
Поддержка атрибутов OpenAPI: Swagger Codegen поддерживает большинство атрибутов OpenAPI, включая "$ref", "allOf" и "oneOf".
Обширная документация и сообщество: Swagger Codegen имеет обширную документацию и большое активное сообщество, что облегчает поиск решений и устранение проблем.
Пример кода на Object Pascal (Delphi) с использованием Swagger Codegen
Ниже приведен пример кода, сгенерированного Swagger Codegen для Object Pascal (Delphi):
unit PetstoreApi;
interface
uses
System.SysUtils,
System.JSON,
System.Net.Http,
System.Net.Http.Headers;
type
TPet = record
Id: Integer;
Name: string;
Status: string;
Tags: TArray<TTag>;
end;
TTag = record
Id: Integer;
Name: string;
end;
IPetApi = interface
['{423F6B74-4552-4772-9516-5D9E5C56A956}']
function GetPetById(PetId: Integer): TPet;
procedure UpdatePet(Pet: TPet);
procedure DeletePet(PetId: Integer);
procedure AddPet(Pet: TPet);
end;
implementation
uses
System.Net.Http.Dispatch;
type
TPetApiClient = class(TInterfacedObject, IPetApi)
private
FHttpClient: THttpClient;
FBaseUrl: string;
public
constructor Create(BaseUrl: string);
destructor Destroy; override;
function GetPetById(PetId: Integer): TPet;
procedure UpdatePet(Pet: TPet);
procedure DeletePet(PetId: Integer);
procedure AddPet(Pet: TPet);
end;
{ TPetApiClient }
constructor TPetApiClient.Create(BaseUrl: string);
begin
FHttpClient := THttpClient.Create(nil);
FBaseUrl := BaseUrl;
end;
destructor TPetApiClient.Destroy;
begin
FHttpClient.Free;
inherited;
end;
function TPetApiClient.GetPetById(PetId: Integer): TPet;
var
Request: THttpRequest;
Response: THttpResponse;
begin
Request := THttpRequest.Create(THttpMethod.Get, Format('pets/%d', [PetId]));
Response := FHttpClient.SendRequest(Request, FBaseUrl);
Result := TPet.ParseJSON(TJson.ParseString(Response.Content));
end;
procedure TPetApiClient.UpdatePet(Pet: TPet);
var
Request: THttpRequest;
Response: THttpResponse;
begin
Request := THttpRequest.Create(THttpMethod.Put, 'pets');
Request.SetContent(Pet.ToJSON, 'application/json');
Response := FHttpClient.SendRequest(Request, FBaseUrl);
if Response.StatusCode >= 400 then
raise Exception.CreateS('Request failed with status code: ' + Response.StatusCode.ToString);
end;
procedure TPetApiClient.DeletePet(PetId: Integer);
var
Request: THttpRequest;
Response: THttpResponse;
begin
Request := THttpRequest.Create(THttpMethod.Delete, Format('pets/%d', [PetId]));
Response := FHttpClient.SendRequest(Request, FBaseUrl);
if Response.StatusCode >= 400 then
raise Exception.CreateS('Request failed with status code: ' + Response.StatusCode.ToString);
end;
procedure TPetApiClient.AddPet(Pet: TPet);
var
Request: THttpRequest;
Response: THttpResponse;
begin
Request := THttpRequest.Create(THttpMethod.Post, 'pets');
Request.SetContent(Pet.ToJSON, 'application/json');
Response := FHttpClient.SendRequest(Request, FBaseUrl);
if Response.StatusCode >= 400 then
raise Exception.CreateS('Request failed with status code: ' + Response.StatusCode.ToString);
end;
end.
Вывод
Генератор OpenAPI клиента от Arnaud Bouchez предлагает ряд полезных функций для разработчиков, работающих с Delphi и FPC. Однако, для тех, кто ищет альтернативу, Swagger Codegen является мощным и гибким инструментом, поддерживающим Object Pascal и множество других языков программирования. Оба генератора имеют свои преимущества, и выбор между ними будет зависеть от конкретных потребностей и предпочтений разработчика.
Эта статья посвящена обзору и альтернативному решению генератора клиента OpenAPI для Delphi и FPC, представленного Arnaud Bouchez, и рассмотрению популярного генератора Swagger Codegen в качестве альтернативы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.