OpenAPI サーバー

Delphi の HTTP サーバー内に直接 OpenAPI 3 の REST API をホストできます。スペックファーストでもコードファーストでも、自動 Swagger UI、リクエスト検証、CORS を備え — スペックが唯一の信頼できる情報源(Single Source of Truth)になります。

TsgcWSAPIServer_OpenAPI

TsgcWebSocketHTTPServer に組み込めるドロップイン API サーバーです。OpenAPI 3 のスペックを読み込み(または注釈付き Pascal クラスから生成し)、operationId によって受信リクエストをディスパッチします。

コンポーネントクラス

TsgcWSAPIServer_OpenAPI

仕様

OpenAPI 3.0

プラットフォーム

Windows、macOS、Linux、iOS、Android

エディション

Enterprise

スペックファーストでもコードファーストでも — どちらも 3 行で開始

コンポーネントを作成し、スペックを読み込み(または生成し)、HTTP サーバーに接続します。コンポーネントはルートをマッチさせ、入力を検証し、/docs で Swagger UI を自動的に提供します。

uses
  sgcWebSocket, sgcWebSocket_Server_API_OpenAPI,
  sgcHTTP_OpenAPI_Server;

var
  Server: TsgcWebSocketHTTPServer;
  OpenAPI: TsgcWSAPIServer_OpenAPI;
begin
  Server := TsgcWebSocketHTTPServer.Create(nil);
  Server.Port := 8080;

  OpenAPI := TsgcWSAPIServer_OpenAPI.Create(nil);
  OpenAPI.OnRequest := HandleRequest;
  OpenAPI.OpenAPIOptions.Endpoint.ServeSwaggerUI := True;
  OpenAPI.OpenAPIOptions.Validation.ValidateRequest := True;
  OpenAPI.OpenAPIOptions.CORS.Enabled := True;

  OpenAPI.LoadFromFile('petstore.json');
  OpenAPI.Server := Server;
  Server.Active := True;
  // Swagger UI:  http://localhost:8080/docs
  // Raw spec:    http://localhost:8080/openapi.json
end;

procedure THost.HandleRequest(Sender: TObject;
  const aOperationId: string;
  const aContext: TsgcOpenAPIServerContext;
  var Handled: Boolean);
begin
  Handled := True;
  if aOperationId = 'getPetById' then
    aContext.RespondJSON(200, PetAsJSON(aContext.PathParamAsInteger('petId')))
  else
    Handled := False;
end;
uses
  sgcWebSocket_Server_API_OpenAPI,
  sgcHTTP_OpenAPI_Server_CodeFirst;

type
  [sgcServiceContract('Task Manager', '', '1.0.0')]
  [sgcRoute('/api/v1')]
  TTaskService = class
  public
    [sgcHttpGet] [sgcRoute('/tasks/{taskId}')]
    [sgcSummary('Get a task by ID')]
    [sgcResponse(200, 'The requested task')]
    [sgcResponse(404, 'Task not found')]
    procedure GetTask([sgcFromPath][sgcRequired] const taskId: Integer); virtual;
  end;

// Generate the spec from RTTI and feed it to the component:
var
  Scanner: TsgcOpenAPICodeFirstScanner;
begin
  Scanner := TsgcOpenAPICodeFirstScanner.Create;
  try
    OpenAPI.LoadFromString(Scanner.GenerateSpec(TTaskService));
  finally
    Scanner.Free;
  end;
  OpenAPI.Server := Server;
  Server.Active := True;
end;

主な機能

API を定義する 2 つの方法、4 つのパイプラインフック、スペックに対する検証、そしてコンポーネント自身が提供する Swagger UI ページ。

スペックファーストモード

既存の OpenAPI 3 ドキュメントを LoadFromFile または LoadFromString で読み込みます。ルート、パラメータ、スキーマが解析され、サーバーが守るべき契約になります — JSON を変更し、再起動するだけで完了です。

コードファーストモード

Pascal クラスに sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse 属性を付与します。TsgcOpenAPICodeFirstScanner が RTTI を走査し、実行時にスペックを出力します — JSON を手書きする必要はありません。

組み込み Swagger UI

OpenAPIOptions.Endpoint.ServeSwaggerUI を有効にすると、サーバーが /docs で対話的な try-it-out ページを公開し、/openapi.json から情報を取得します — 別途ドキュメントをビルドする必要も、静的エクスポートも不要です。

リクエスト検証

ボディ、クエリ文字列、パスパラメータおよび必須フィールドを、スペックのスキーマに対して検証します。失敗時には OnValidationError がエラー一覧と、拒否または続行を選択する Continue フラグを提供します。

CORS

OpenAPIOptions.CORS.Enabled := True を設定すると、サーバーがすべてのルートでプリフライトの OPTIONS に応答し、AllowOrigins / AllowHeaders / AllowMethods ポリシーを適用します。

コンテキストヘルパー

TsgcOpenAPIServerContextPathParamAs*QueryParamAs*HeaderValueBodyAsString / BodyAsJSON に加え、RespondJSON および RFC 7807 形式の RespondError を公開します。

パイプラインイベント

OnBeforeRequestOnAfterRequestOnAuthenticateOnException がメインの OnRequest ハンドラーをラップします — サブクラス化することなく、ショートサーキット、ロギング、認証、例外の再マッピングが可能です。

ベースパスのプレフィックス

OpenAPIOptions.Endpoint.BasePath はすべてのルートおよび組み込みの /openapi.json/docs エンドポイントにプレフィックスを付加します。これにより API を /api/v1 など任意の名前空間の配下に配置できます。

検証属性(コードファースト)

sgcRequiredsgcMinLengthsgcMaxLengthsgcRangesgcPattern が対応するスキーマ制約を出力するため、生成されたスペックに同じルールが反映され、実行時にも強制されます。

仕様 & 参考資料

このコンポーネントが実装しているプロトコルおよびフォーマットの公式情報源。

ドキュメント & デモ

コンポーネントリファレンスへのディープリンク、すぐに実行できるデモプロジェクト、体験版のダウンロード。

オンラインヘルプ — OpenAPI サーバー このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンス。
デモプロジェクト — Demos\23.OpenAPI すぐに実行できる 2 つの例:スペックファースト(Petstore JSON)とコードファースト(タスクマネージャー)。sgcWebSockets パッケージに同梱 — 下記より体験版をダウンロードしてください。
ユーザーマニュアル (PDF) ライブラリ内のすべてのコンポーネントを網羅した包括的なマニュアル。

ドキュメント化された REST API をリリースする準備はできましたか?

無料体験版をダウンロードして、OpenAPI スペックを動作する Delphi サーバーに変換しましょう — Swagger UI も同梱されています。