Skip to content

OTR_WebAPI

nishi_74322014 edited this page Oct 27, 2026 · 1 revision

Web API(リソースサーバとクライアント)

概要

ASP.NET Core(net10.0)で Open 棟梁の Web API サーバを作り、.NET から呼ぶ方式。

  • サーバは OAuth2 のリソースサーバ(Authorization: Bearer ヘッダで都度認証。Cookie・セッションは使わない)。
  • B 層・D 層は、画面のアプリと同じものを使う。
  • OAuth2 / OIDC アーキテクチャ(Frontend、WebAPI、汎用認証サイト)でソリューションを組む際の、バックエンドの基本になる(ソリューション提供のサポート)。
  • 通信制御(サービス論理名で WCF などを切り替える仕組み)とは別物である。

詳細

サーバ:コントローラ

素の ControllerBase に属性を 4 つ付ける。

[EnableCors]
[ApiController]
[MyBaseAsyncApiController(httpAuthHeader: EnumHttpAuthHeader.None | EnumHttpAuthHeader.Bearer)]
[Route("api/[controller]/[action]")]
public class BatchUpdateController : ControllerBase
{
    [HttpGet]
    public string test() => "test";   // 疎通確認用(DB を使わない)

    [HttpPost]
    public async Task<IActionResult> SelectCount()
    {
        MyBaseAsyncApiController.GetClaims(
            out string userName, out _, out _, out string ipAddress);

        var pv = new SuppliersParameterValue(
            "BatchUpdateController", "-", "SelectCount", "SelectCount", new MyUserInfo(userName, ipAddress));
        var rv = (SuppliersReturnValue)await new SuppliersLayerB().DoBusinessLogicAsync(
            pv, DbEnum.IsolationLevelEnum.DefaultTransaction);

        // camelCase の JSON で返す
        return this.Content(JsonConvert.SerializeObject(new { Count = rv.Count }, this.JSS));
    }
}
  • [MyBaseAsyncApiController](親クラス2)が、認証・例外・アクション前後の処理を担う。
  • クレーム(ユーザ名、ロール、スコープ、IP アドレス)は GetClaims で取り出し、MyUserInfo を作って引数クラスで B 層に渡す。
  • 業務エラーの応答は形を固定する:{ errorMessageID, errorMessage, errorInfo }。
  • [ValidateAntiForgeryToken] は付けない(Bearer ヘッダはブラウザが自動で付けないので、CSRF は成立しない)。

クライアント:呼び出し

  • エンドポイントは http(s)://<host>/api/<controller>/<action>。疎通は GET .../test、業務は POST。
  • 本文はサーバの受け方に合わせる([FromBody] なら JSON、[FromForm] ならフォーム)。
  • 認証は Authorization: Bearer <token>。トークンは IdP から取得する(OAuth2 / OIDC クライアント)。コードに直書きしない。
  • 応答は状態コードと「形」で判定する。 本文の部分一致だけで判定すると、エラー・ページの HTML で誤判定する。4xx / 5xx でも本文を読む。

DataTable の受け渡し(DTTables JSON)

一覧を編集して戻す場合は、DataTable を DTTables の JSON でやり取りする。

// 送る:変更前の値も保持する
DTTables dtts = new DTTables();
dtts.Add(DTTable.FromDataTable(dt, keepOriginal: true));
string json = DTTables.DTTablesToJson(dtts);

// 受け取る
DataTable dt2 = DTTables.JsonToDTTables(json).ToDataTable();   // RowState と Original が戻る
  • keepOriginal: true で送ると、往復後も RowState と変更前の値が残り、サーバ側の楽観排他が成立する(DataTable によるバッチ更新)。
  • 素の JSON で DataTable をやり取りすると、RowState と変更前の値が落ちる。

その他

  • OpenAPI(/openapi/v1.json)と CORS を構成する。
  • コンテナで動かす手順はDocker対応(Docker/ASPNETWebService/)。

コーディング・エージェントに任せる場合

  • サーバはスキル opentouryo-webapi-server、クライアントは opentouryo-webapi-client を使わせる。
  • 認証方式(既定は認証なし、Bearer は JWT 検証の雛形のみ)はプロジェクトで決める。エージェントに推測させず、PROJECT-POLICY.md で確認させる。

参考


Tags: 再構築

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki
開発基盤部会 Wiki

移行管理: DONE / TODO

Clone this wiki locally