.NET ヘルプ

Nswag C#(開発者向けの動作方法)

更新済み 6月 6, 2024
共有:

イントロダクション

APIは今日のソフトウェア開発環境において不可欠であり、様々なソフトウェアシステムおよびコンポーネント間の通信を容易にします。 開発者がAPIを効率的に使用するためには、徹底的で理解しやすいドキュメントが必要です。 C# API ドキュメントワークフローを支援する効果的なツールとして、NSwag c# と IronPDF があります。 この記事では、NSwagを使用して生成する方法について説明します。 API .NET Coreの仕様で高品質なPDFドキュメントを生成するために、IronPDFを使用します。

NSwagをC#で使用する方法

  1. Swagger UIを使用してRESTful Web APIを作成します。

  2. C#コンソールアプリケーションを作成する。

  3. NSwagライブラリをインストールします。

  4. 名前空間をインポートし、オブジェクトを作成します。

  5. Swagger JSONをC#コードに処理します。

  6. コードを実行して結果を表示します。

NSwagを理解する

NSwagという.NET Swaggerツールチェーンは、ASP.NET Web API、ASP.NET Core、またはその他の.NETフレームワークを使用して構築されたAPIのSwagger仕様、またはOpenAPIドキュメントを作成するのを容易にするために作成されました。

NSwagの機能

Swagger仕様の生成

コントローラー、モデル、および.NETアセンブリはすべて、NSwagによって自動的にSwagger仕様を生成するために使用できます。 NSwagは、APIコードの構造を調査することにより、APIエンドポイント、リクエスト/レスポンス形式、認証技術などをカバーする包括的なドキュメントを生成します。

.NETプロジェクトへの接続

開発者は、NSwagを.NETプロジェクトに統合することで、開発プロセスにSwagger生成を簡単に組み込むことができます。 開発者は、.NET CoreプロジェクトにNSwagを追加することで、コードベースとともにドキュメントの更新を確実に行うことができます。これにより、プロジェクトがビルドされるたびにSwagger仕様が自動的に生成されます。

パーソナライゼーションと拡張

NSwagが提供する幅広いカスタマイズの可能性により、開発者は生成されたSwagger仕様を簡単に自分のニーズに合わせて適応させることができます。 開発者は、設定およびアノテーションを通じて、生成されたドキュメントのレスポンスコード、パラメータの説明、ルート命名規則などの多くのコンポーネントを制御することができます。

Nswagの始め方

C# コンソールアプリケーションにおける Nswag のセットアップ

Nswag Base Class Libraryには、コア、Annotation、およびコード生成の名前空間が含まれており、Nugetからインストールすることで利用可能になります。 NSwagをC#アプリケーションに統合してコードとSwagger仕様を生成する方法、およびNSwagが開発プロセスの効率をどのように向上させるかについて。

Nswag C# (開発者向けの動作方法): 図1 - Visual Studioパッケージ マネージャーでNswagを検索し、インストールする

WindowsコンソールとフォームにおけるNswagの実装

自動化されたクライアント生成を通じて、開発者はNSwagをWindowsデスクトップアプリケーションに統合することにより、デスクトップアプリ内からAPIにアクセスするためのコードを効率的に生成することができます。 オンラインサービスやRESTful APIと通信するデスクトップアプリケーションを開発する場合、非常に役立ちます。

NSwagは、Webアプリケーションで内部APIのAPIドキュメントを生成し、外部APIを消費するためのクライアントコードを生成するために使用できます。これは、開発者がアプリケーションのフロントエンドとバックエンドコンポーネントを一貫して保つのに役立ちます。

Nswag C#の例

以下は、NSwagを使用してC#クライアントコードを生成する方法を示すコードの例です:

using NSwag.CodeGeneration.CSharp;
using NSwag;
using System.Reflection;
using System.CodeDom.Compiler;
using Microsoft.CodeAnalysis;
class Program
{
    static async Task Main(string[] args)
    {
        System.Net.WebClient wclient = new System.Net.WebClient();
        // create json file data from the swagger net core web api
        var document = await OpenApiDocument.FromJsonAsync(wclient.DownloadString("http://localhost:5013/swagger/v1/swagger.json"));
        wclient.Dispose();
        var settings = new CSharpClientGeneratorSettings
        {
            ClassName = "Weather",
            CSharpGeneratorSettings =
    {
        Namespace = "Demo"
    }
        };
        var generator = new CSharpClientGenerator(document, settings);
        var code = generator.GenerateFile();
        var assembly = CompileCode(code);
        var clientType = assembly.GetType("Demo.WeatherClient"); // Replace with your actual client class name
        var httpClient = new HttpClient();
        var client = (IApiClient)Activator.CreateInstance(clientType, httpClient);
        var result = await client.GetWeatherForecastAsync();
        foreach (var item in result)
        {
            Console.WriteLine($"Date: {item.Date} F: {item.TemperatureF} C: {item.TemperatureC} Summary: {item.Summary}");
        }
    }
    static Assembly CompileCode(string code)
    {
        using (var memoryStream = new MemoryStream())
        {
            var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
            List<MetadataReference> references = new List<MetadataReference>();
            references.Add(MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location));
            references.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "Microsoft.AspNetCore.Mvc.dll")));
            references.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Web.Http.dll")));
            var compilation = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create("ApiClient")
                .AddReferences(Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
                .AddSyntaxTrees(Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseSyntaxTree(code)).AddReferences(references);
            var emitResult = compilation.Emit(memoryStream);
            if (!emitResult.Success)
            {
                var diagnostics = emitResult.Diagnostics;
                Console.WriteLine("Compilation errors:");
                foreach (var diagnostic in diagnostics)
                {
                    Console.WriteLine(diagnostic);
                }
                return null;
            }
            memoryStream.Seek(0, SeekOrigin.Begin);
            return Assembly.Load(memoryStream.ToArray());
        }
    }
    public interface IApiClient
    {
        Task<List<WeatherForecast>> GetWeatherForecastAsync(); // Replace with your actual method name and return type
    }
    public class WeatherForecast
    {
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        public int TemperatureF { get; set; }
        public string Summary { get; set; }
    }
}
using NSwag.CodeGeneration.CSharp;
using NSwag;
using System.Reflection;
using System.CodeDom.Compiler;
using Microsoft.CodeAnalysis;
class Program
{
    static async Task Main(string[] args)
    {
        System.Net.WebClient wclient = new System.Net.WebClient();
        // create json file data from the swagger net core web api
        var document = await OpenApiDocument.FromJsonAsync(wclient.DownloadString("http://localhost:5013/swagger/v1/swagger.json"));
        wclient.Dispose();
        var settings = new CSharpClientGeneratorSettings
        {
            ClassName = "Weather",
            CSharpGeneratorSettings =
    {
        Namespace = "Demo"
    }
        };
        var generator = new CSharpClientGenerator(document, settings);
        var code = generator.GenerateFile();
        var assembly = CompileCode(code);
        var clientType = assembly.GetType("Demo.WeatherClient"); // Replace with your actual client class name
        var httpClient = new HttpClient();
        var client = (IApiClient)Activator.CreateInstance(clientType, httpClient);
        var result = await client.GetWeatherForecastAsync();
        foreach (var item in result)
        {
            Console.WriteLine($"Date: {item.Date} F: {item.TemperatureF} C: {item.TemperatureC} Summary: {item.Summary}");
        }
    }
    static Assembly CompileCode(string code)
    {
        using (var memoryStream = new MemoryStream())
        {
            var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
            List<MetadataReference> references = new List<MetadataReference>();
            references.Add(MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location));
            references.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "Microsoft.AspNetCore.Mvc.dll")));
            references.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Web.Http.dll")));
            var compilation = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create("ApiClient")
                .AddReferences(Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(typeof(object).Assembly.Location))
                .AddSyntaxTrees(Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseSyntaxTree(code)).AddReferences(references);
            var emitResult = compilation.Emit(memoryStream);
            if (!emitResult.Success)
            {
                var diagnostics = emitResult.Diagnostics;
                Console.WriteLine("Compilation errors:");
                foreach (var diagnostic in diagnostics)
                {
                    Console.WriteLine(diagnostic);
                }
                return null;
            }
            memoryStream.Seek(0, SeekOrigin.Begin);
            return Assembly.Load(memoryStream.ToArray());
        }
    }
    public interface IApiClient
    {
        Task<List<WeatherForecast>> GetWeatherForecastAsync(); // Replace with your actual method name and return type
    }
    public class WeatherForecast
    {
        public DateTime Date { get; set; }
        public int TemperatureC { get; set; }
        public int TemperatureF { get; set; }
        public string Summary { get; set; }
    }
}
Imports NSwag.CodeGeneration.CSharp
Imports NSwag
Imports System.Reflection
Imports System.CodeDom.Compiler
Imports Microsoft.CodeAnalysis
Friend Class Program
	Shared Async Function Main(ByVal args() As String) As Task
		Dim wclient As New System.Net.WebClient()
		' create json file data from the swagger net core web api
		Dim document = Await OpenApiDocument.FromJsonAsync(wclient.DownloadString("http://localhost:5013/swagger/v1/swagger.json"))
		wclient.Dispose()
		Dim settings = New CSharpClientGeneratorSettings With {
			.ClassName = "Weather",
			.CSharpGeneratorSettings = { [Namespace] = "Demo" }
		}
		Dim generator = New CSharpClientGenerator(document, settings)
		Dim code = generator.GenerateFile()
		Dim assembly = CompileCode(code)
		Dim clientType = assembly.GetType("Demo.WeatherClient") ' Replace with your actual client class name
		Dim httpClient As New HttpClient()
		Dim client = DirectCast(Activator.CreateInstance(clientType, httpClient), IApiClient)
		Dim result = Await client.GetWeatherForecastAsync()
		For Each item In result
			Console.WriteLine($"Date: {item.Date} F: {item.TemperatureF} C: {item.TemperatureC} Summary: {item.Summary}")
		Next item
	End Function
	Private Shared Function CompileCode(ByVal code As String) As System.Reflection.Assembly
		Using memoryStream As New MemoryStream()
			Dim assemblyPath = Path.GetDirectoryName(GetType(Object).Assembly.Location)
			Dim references As New List(Of MetadataReference)()
			references.Add(MetadataReference.CreateFromFile(GetType(Object).GetTypeInfo().Assembly.Location))
			references.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "Microsoft.AspNetCore.Mvc.dll")))
			references.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Web.Http.dll")))
			Dim compilation = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create("ApiClient").AddReferences(Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(GetType(Object).Assembly.Location)).AddSyntaxTrees(Microsoft.CodeAnalysis.CSharp.SyntaxFactory.ParseSyntaxTree(code)).AddReferences(references)
			Dim emitResult = compilation.Emit(memoryStream)
			If Not emitResult.Success Then
				Dim diagnostics = emitResult.Diagnostics
				Console.WriteLine("Compilation errors:")
				For Each diagnostic In diagnostics
					Console.WriteLine(diagnostic)
				Next diagnostic
				Return Nothing
			End If
			memoryStream.Seek(0, SeekOrigin.Begin)
			Return System.Reflection.Assembly.Load(memoryStream.ToArray())
		End Using
	End Function
	Public Interface IApiClient
		Function GetWeatherForecastAsync() As Task(Of List(Of WeatherForecast)) ' Replace with your actual method name and return type
	End Interface
	Public Class WeatherForecast
		Public Property [Date]() As DateTime
		Public Property TemperatureC() As Integer
		Public Property TemperatureF() As Integer
		Public Property Summary() As String
	End Class
End Class
VB   C#

使用したいAPIについては、Swagger仕様のURLを指定します。 (swaggerUrl). 次に、DLLアセンブリに生成され実行されるクライアントコードが定義されます。 OpenApiDocumentが使用されます。 指定されたURLからSwaggerドキュメントを非同期で読み込むには、FromJsonAsyncを使用します。 生成されたクライアントコードを変更するには、コードジェネレーターの設定を調整します。 (CSharpClientGeneratorSettings (C# クライアント生成設定)). この例では、生成されたクライアントコードのクラス名と名前空間が指定されています。

ロードされたSwaggerドキュメントから、CSharpClientGeneratorのインスタンスを構築し、それを使用してクライアントコードを生成します。 (クライアントコード). 作成されたクライアントコードは指定された出力パスに保存されます。 手順中に発生する可能性のある例外やエラーに対応し、関連する通知をコンソールに表示します。

NSwag C# (開発者向けの使い方): 図2 - 上記のコードからのコンソール出力

NSwag操作

クライアントコードの生成

NSwagは、Swagger仕様を使用してJava、TypeScript、C#など多くの言語でクライアントコードを生成することができます。 これにより、開発者がアプリケーションでAPIを簡単に使用できるようになります。

サーバーコードの生成

Swagger仕様を基に、NSwagはASP.NET Coreコントローラーのようなサーバーコードを生成することもできます。 これは、API実装のためのサーバーサイドコードを迅速に作成するのに役立ちます。

インタラクティブなAPIドキュメントの作成

Swagger仕様を考慮して、NSwagはSwagger UIのようなインタラクティブなAPIドキュメントを生成することができます。 APIエンドポイントの調査とテストのために、このドキュメントは使いやすいインターフェイスを提供します。

プロキシクラスの生成

SOAPベースのAPIと統合するために、NSwagはプロキシクラスを生成できます。 これにより、プログラマーは生成されたクライアントコードを使用して、アプリケーション内からSOAPサービスにアクセスすることができます。

Swagger仕様の検証

NSwagは、Swagger仕様がOpenAPI/Swagger標準に従っていることを確認することができます。 これにより、APIドキュメントのエラーや不一致を確認しやすくなります。

IronPDFとNSwagの統合

開発者は、NSwagとIronPDFを統合することで、両方の技術の利点を活用し、APIドキュメントのワークフローを改善することができます。 開発者は、NSwagを使用してSwagger仕様を生成し、IronPDFを使用してこれらをPDFに変換することで、包括的でオフライン対応のネットWeb APIドキュメントを作成し、簡単にアクセスおよび共有可能にすることができます。 ドキュメント. 以下の手順は統合プロセスの一部です:

IronPDF をインストール

  • Visual Studio プロジェクトを開始します。
  • 「ツール」 > 「NuGet パッケージ マネージャー」 > 「パッケージ マネージャー コンソール」を選択します。

  • コマンドプロンプトを開き、パッケージ マネージャー コンソールで次のコマンドを入力してください:
Install-Package IronPdf
  • または、ソリューションのためにNuGetパッケージマネージャを使用してIronPDFをインストールすることもできます。
  • 検索結果からIronPDFパッケージを探して選択し、「インストール」オプションをクリックします。 Visual Studioは、ダウンロードおよびインストールを代わりに処理します。

    Nswag C#(開発者向けの仕組み):図3 - NuGetパッケージマネージャーの検索バーに「IronPdf」と入力して検索し、プロジェクトを選択してインストールボタンをクリックすることで、Manage NuGet Package for Solutionを使用してIronPDFをインストールします。

  • NuGetは、IronPDFパッケージとプロジェクトに必要なすべての依存関係をインストールします。
  • インストール後、IronPDF をプロジェクトで利用できます。

NuGetウェブサイトからインストールする

IronPDFの機能、互換性、利用可能なダウンロードに関する追加情報については、NuGetウェブサイトのhttps://www.nuget.org/packages/IronPdfのページをご覧ください。

DLL を使用してインストール

あるいは、DLLファイルを使用してIronPDFをプロジェクトに直接組み込むこともできます。DLLが含まれたZIPファイルをダウンロードするには、こちらをクリックしてください。 リンク. ファイルを解凍し、DLLをプロジェクトに追加してください。

DLLを含むZIPファイルを取得するには。 解凍後、DLLをプロジェクトに組み込んでください。

ロジックの実装

NSwagを活用することで、開発者はIronPDFと組み合わせてCodeGeneration.CSharpを使用することにより、APIドキュメントとクライアントコードをより迅速に作成することができます。 以下の手順は、統合ワークフローに含まれます:

  1. クライアントコードの生成: Swagger仕様からC#クライアントコードを生成するには、NSwag.CodeGeneration.CSharpを使用します。 このステップでは、APIエンドポイントと通信するためのクライアントクラスとメソッドの作成が自動化されます。

  2. NSwagを利用してGetDataする方法: Swagger仕様からJSONドキュメントを生成するには、CodeGeneration.CSharpを使用してください。 この段階では、リクエスト/レスポンス形式、認証技術、およびAPIクライアントエンドポイントが、人間が読みやすいドキュメントに作成されます。

  3. JSONをPDFに変換: 生成されたコードの結果をPDFドキュメントに変換するには、IronPDFを使用します。 この段階では、HTMLテキストが仕上げられたPDFドキュメントに変換され、共有や配布の準備が整います。

  4. PDFドキュメントの改善: IronPDFを使用して、ヘッダー、フッター、ウォーターマーク、または独自のブランディングなど、PDFドキュメントにさらにコンテンツを追加します。 このステージでは、開発者がPDFドキュメントの外観やブランディングを自分の好みに合わせてパーソナライズする能力が与えられます。
using IronPdf;        
StringBuilder sb = new StringBuilder();

foreach (var item in result)
{
    sb.Append($"<p>Date: {item.Date} F: {item.TemperatureF} C: {item.TemperatureC} Summary: {item.Summary}</p>");
}
var Renderer = new IronPdf.HtmlToPdf();
var PDF = Renderer.RenderHtmlAsPdf(sb.ToString());
// Save PDF to file
PDF.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully!");
Console.ReadKey();
using IronPdf;        
StringBuilder sb = new StringBuilder();

foreach (var item in result)
{
    sb.Append($"<p>Date: {item.Date} F: {item.TemperatureF} C: {item.TemperatureC} Summary: {item.Summary}</p>");
}
var Renderer = new IronPdf.HtmlToPdf();
var PDF = Renderer.RenderHtmlAsPdf(sb.ToString());
// Save PDF to file
PDF.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully!");
Console.ReadKey();
Imports IronPdf
Private sb As New StringBuilder()

For Each item In result
	sb.Append($"<p>Date: {item.Date} F: {item.TemperatureF} C: {item.TemperatureC} Summary: {item.Summary}</p>")
Next item
Dim Renderer = New IronPdf.HtmlToPdf()
Dim PDF = Renderer.RenderHtmlAsPdf(sb.ToString())
' Save PDF to file
PDF.SaveAs("output.pdf")
Console.WriteLine("PDF generated successfully!")
Console.ReadKey()
VB   C#

上記のコードは、結果オブジェクトから取得したデータにアクセスし、「Date」、「TemperatureF」、「TemperatureC」、「Summary」のフィールドをループ内で段落に追加します。次に、PDFの出力ファイルパスを指定し、PDFが正常に生成されたことをユーザーに通知します。

以下は上記のコードからの結果です。

Nswag C# (開発者のための動作方法): 図4 - 上記のコードからの出力例

結論

CodeGeneration NSwagテクノロジーのCSharpやIronPDFは、クライアントコードの生成およびAPIドキュメンテーションのプロセスを効率化するためにうまく連携します。 これらのツールをC#アプリケーションに統合することで、開発者はAPI駆動のソリューションの作成をスピードアップし、APIドキュメントの作成を自動化し、プロフェッショナルな外観のPDF出版物を生成できます。 NSwag.CodeGeneration.CSharp と IronPDF は、デスクトップ、ウェブ、クラウドベースのアプリケーションを開発しているかどうかにかかわらず、API を効率的にドキュメント化し、C# でクライアント コードを生成するための完全なソリューションを提供します。

$749 Liteバンドルには、永久ライセンス、1年間のソフトウェア保守、およびライブラリのアップグレードが含まれています。 IronPDFは再配布と時間に制限のある無料ライセンスを提供しています。ユーザーは試用期間中、透かしを視認することなくソリューションを評価できます。 価格およびライセンスに関する追加情報については、IronPDFのライセンスをご覧ください。 ページ. こちらのページでIron Softwareに関する追加情報をご覧ください。 ライブラリ.

< 以前
Dapper C#(開発者向けの動作方法)
次へ >
Fluent C#(開発者向けの仕組み)

準備はできましたか? バージョン: 2024.9 新発売

無料のNuGetダウンロード 総ダウンロード数: 10,659,073 View Licenses >