この記事は
microCMS Advent Calendar 2025 5日目の記事です。
microCMS は、日本語で使える Headless CMS の代表格です。
Web 管理画面で記事やデータを編集すると、その内容が REST API から JSON として取得できます。React / Next.js で使われることが多いですが、実際には「API で取得できる」仕組みさえあればどんな言語からでも利用できます。
はじめに
microCMS といえば Next.js や React といった JavaScript フレームワークと組み合わせる CMS というイメージが強いかもしれません。
しかし今回、
「C#(それも WinForms)から microCMS を触るとどうなる?」
と試してみたところ・・・
意外と、驚くほど簡単に動いた!!
という結果になったので、
- なぜ C# と相性がいいと感じたのか
- 実際のコードはどの程度で済むのか
をまとめました。
なぜ microCMS と C# は“意外と”相性がいいのか?
まず最初に、今回感じた 「相性の良さ」 を先に整理しておきます。
▶ REST API がとても“素直”に作られていた
microCMS の API は、かなりシンプルです。
- 認証は APIキーをヘッダに付けるだけ
- 特殊な署名やトークン生成は不要
- HTTP GET で単純に JSON が返ってくる
C# の HttpClient との組み合わせが非常にスムーズで、ほぼ追加設定なしで通信が成立しました。
→ C# から叩く上で障壁がほぼゼロ。
▶ microCMS の JSON 構造が C# のクラスにマッピングしやすい
microCMS のデータは、クセのないシンプルな JSON で返ってきます。
そのため C# 側では、
- JSON のキー名と同じプロパティを用意して
-
System.Text.Jsonでデシリアライズするだけ
で、ほぼ何も考えずに扱えます。
→ DataClass(モデルクラス)の設計が非常に簡単。
▶ C#の事例が少ないので色々な発見があって面白い
microMS の記事やサンプルは JS などが中心です。
C# + WinForms の組み合わせはあまり見かけないため、
「既存のデスクトップアプリを、ちょっとだけクラウド化したい」
といったオンプレ環境でのニーズには、意外と活用できそうな構成だと思います。
→ 例えば、複数ある既存アプリに一斉に「作業手順」を表示したいみたいなことが簡単にできる!
1. microCMS 側の準備
ここからは、実際に動かすための手順に入ります。
まずは microCMS 側で最低限の API を準備ていきます。
※アカウント作成は「無料ではじめる」から簡単に登録できるのでここでは割愛します。やはり「日本語で使える」というのは安心感がありますね。
✔ 1-1. サービスを追加する
まずは、新しくサービスを追加してきます。
左側のメニューから「+」を選択します。
サービスの追加で「一から作成する」を選択してください。
「サービス名」と「サービスID」は何でもOKなのですが。ここでは以下を設定しました。
- サービス名:お知らせ
- サービスID:message (サービスIDは重複禁止)
完成です!!
✔ 1-2. コンテンツを作成する
次にコンテンツを作成します。
「お知らせ」を選択します。
✔ 1-3. テストデータを1件登録する
動作確認用に、1件だけコンテンツを作っておきます。
・・・と思ったら最初にひとつ自動ですでに作成されていました。
せっかくなので、もうひとつ登録しておきましょう..
- タイトル:テスト通知
- 本文:WinFormsから取得できるかの確認です。
後ほど WinForms アプリで、このタイトルと本文がそのまま表示されます。
✔ 1-3. APIキーを発行
左メニューの「1個のAPIキー」が自動で作成されています。今回はデフォルトで許可されている GET のみ許可なので何もしなくてOKです。
- この APIキーを C# のコードから利用します
- 今回はサンプルのためコードに直書きしますが、実務では環境変数や Secret Manager などで管理するのがおすすめです
2. C# WinForms プロジェクトの作成
次に、Visual Studio で WinForms プロジェクトを作成します。
今回は Visual Studio 2022 + .NET 8.0 を使用しました。
ここでは「シンプルなお知らせビューア」を構成していきます。
✔ UI の構成
フォームに次のコントロールを配置します。
-
Button… [button1] 再読み込み処理(Text = "再読み込み") -
ListBox… [listBox1] 記事タイトル一覧を表示 -
TextBox… [textBox1] 本文表示(Multiline = true、ScrollBars = Vertical)
ポイント
WinForms の良さは 「最速でデスクトップUIが作れる」 ところ。今回も「とりあえず表示まで」を最速で実現するという目的にピッタリです。
3. microCMS のレスポンスを C# のクラスで扱える形にする
ここからは C# 側の実装に入ります。
まずは、microCMS の JSON を C# のクラスで扱えるようにします。
✔ なぜクラス化するのか
- JSON 文字列のままだと扱いづらい
- ListBox にバインドしやすくなる(
DataSourceで一覧表示できる) - 将来フィールドが増えたときの変更に強い
という実用面があります。
✔ 実装コード(Models.cs)
// Models.cs
// namespace はプロジェクト名に合わせてください
namespace WinFormsApp1;
using System.Collections.Generic;
// microCMS の一覧レスポンス全体を受けるクラス
public class MicrocmsListResponse<T>
{
public int TotalCount { get; set; }
public List<T> Contents { get; set; } = new();
}
// 「お知らせ」1件分のモデル
public class NoticeItem
{
public string Id { get; set; } = "";
public string Title { get; set; } = "";
public string Content { get; set; } = "";
}
この2つのクラスだけで、
GET /api/v1/notices のレスポンスを綺麗に受け取れます。
4. microCMS API を叩くクライアントクラス
次は、microCMS にリクエストを飛ばす MicrocmsClient を作成します。
✔ なぜクライアントクラスを作るのか
- API 通信ロジックが
Form1に混ざると可読性が落ちる - WinForms 以外(WPF, Console, ASP.NET)にも流用したくなる
- テスト、デバッグ、差し替え(モックなど)がしやすい
「UI」と「外部サービス呼び出し」を分けておくと、後々楽になります。
✔ 実装コード(MicrocmsClient.cs)
// MicrocmsClient.cs
namespace WinFormsApp1;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
public class MicrocmsClient
{
private readonly HttpClient _http;
private readonly string _serviceId;
private readonly string _endpoint;
/// <summary>
/// microCMS 用クライアント。
/// </summary>
public MicrocmsClient(string serviceId, string endpoint, string apiKey)
{
_serviceId = serviceId;
_endpoint = endpoint;
_http = new HttpClient();
_http.DefaultRequestHeaders.Add("X-MICROCMS-API-KEY", apiKey);
}
/// <summary>
/// 「お知らせ」一覧を取得する。
/// </summary>
public async Task<MicrocmsListResponse<NoticeItem>> GetNoticesAsync()
{
var url = $"https://{_serviceId}.microcms.io/api/v1/{_endpoint}";
using var response = await _http.GetAsync(url);
response.EnsureSuccessStatusCode(); // 200系以外なら例外
await using var stream = await response.Content.ReadAsStreamAsync();
var options = new JsonSerializerOptions
{
// totalCount / contents / title / content など
// JSON 側の小文字プロパティ名とマッピングするため
PropertyNameCaseInsensitive = true
};
var result =
await JsonSerializer.DeserializeAsync<MicrocmsListResponse<NoticeItem>>(stream, options);
return result ?? new MicrocmsListResponse<NoticeItem>();
}
}
大事なのは X-MICROCMS-API-KEY をヘッダに付けるだけでよい という点です。このシンプルさのおかげで、C# でも拍子抜けするくらい簡単に扱えます。
5. WinForms で実際に表示させる
続いて、Form1 で API から取得したデータを UI に流し込みます。
✔ 処理の流れ
- フォーム起動時(
OnLoad)に microCMS へリクエスト - 取得した一覧を
ListBoxにバインド - 選択されたアイテムの本文を
TextBoxに表示
という非常にシンプルな3ステップです。
✔ 実装コード(Form1.cs)
// Form1.cs
namespace WinFormsApp1;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
public partial class Form1 : Form
{
// microCMS の serviceId(https://{serviceId}.microcms.io/ の {serviceId})
private const string ServiceId = "message"; // ← 自分の環境に合わせて変更
// API設定画面の「エンドポイント名」
private const string Endpoint = "news"; // ← 自分の環境に合わせて変更
// コンテンツ API キー(GET 権限付き)
private const string ApiKey = "YOUR_CONTENT_API_KEY"; // ← 自分のキーに変更
private MicrocmsClient? _client;
public Form1()
{
InitializeComponent();
// デザイナの既定名をそのまま使う
button1.Text = "再読み込み";
button1.Click += async (_, __) => await ReloadAsync();
listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged;
// textBox1 は MultiLine / ScrollBars をデザイナで設定しておくと見やすいです
}
protected override async void OnLoad(EventArgs e)
{
base.OnLoad(e);
_client = new MicrocmsClient(ServiceId, Endpoint, ApiKey);
await ReloadAsync();
}
/// <summary>
/// microCMS から一覧を取得して画面へ反映。
/// </summary>
private async Task ReloadAsync()
{
if (_client is null)
{
MessageBox.Show("microCMS クライアントが初期化されていません。", "エラー",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var result = await _client.GetNoticesAsync();
if (result.Contents is null || result.Contents.Count == 0)
{
listBox1.DataSource = null;
textBox1.Clear();
MessageBox.Show(
"microCMS から 0 件のデータが返ってきました。\n\n" +
"・公開ステータスの記事があるか\n" +
"・エンドポイント名(" + Endpoint + ")が合っているか\n" +
"・APIキーの権限(GET)が付与されているか\n" +
"を確認してください。",
"データなし",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
return;
}
listBox1.DataSource = result.Contents;
listBox1.DisplayMember = nameof(NoticeItem.Title);
textBox1.Text = result.Contents.First().Content ?? "";
}
catch (HttpRequestException ex)
{
MessageBox.Show(
"microCMS への HTTP アクセスでエラーが発生しました。\n\n" +
ex.Message,
"HTTP エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(
"想定外のエラーが発生しました。\n\n" + ex,
"エラー",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
/// <summary>
/// ListBox の選択変更時に本文を表示。
/// </summary>
private void listBox1_SelectedIndexChanged(object? sender, EventArgs e)
{
if (listBox1.SelectedItem is NoticeItem item)
{
textBox1.Text = item.Content ?? "";
}
}
}
① namespace はプロジェクト名に合わせてください
namespace WinFormsApp1;
Visual Studio で作成したプロジェクト名が WinFormsApp1 以外の場合は、ここを自分のプロジェクト名に変更します。
② フォーム名やコントロール名はデフォルトです
- フォーム …
Form1 - ボタン …
button1 - リスト …
listBox1 - テキストボックス …
textBox1
すべて デザイナで追加したときの既定名のまま 使っています。
名前を変えている場合は、コード側も同じ名前に合わせてください。
③ ServiceId / Endpoint / ApiKey を microCMS 側に合わせてください
private const string ServiceId = "message"; // サービスID
private const string Endpoint = "news"; // エンドポイント名
private const string ApiKey = "YOUR_CONTENT_API_KEY";
ServiceId / Endpoint
microCMS の「サービスID」「サービスID」の確認方法
左メニューの「お知らせ」→ 右上の「API設定」を選択します。
この画面の「エンドポイント」のアドレスから確認できます。
https://message.microcms.io/api/v1/news
ServiceId = "message"; // サービスID
Endpoint = "news"; // エンドポイント名
ApiKey
④ 起動時に自動ロード&ボタンで再読み込みできます
- フォームの
OnLoadでReloadAsync()を一度呼び出し -
button1のクリックでもReloadAsync()を実行
という構成なので、
- アプリ起動時 → 最新のお知らせを自動で取得
- 「再読み込み」ボタン → microCMS 側の更新を手動で反映
という流れになります。
この記事では分かりやすさのために 直書き していますが、実務では環境変数や Secret Manager などに退避させるのがおすすめです。
6. 実行するとどうなる?
アプリを起動すると・・
-
ListBoxに microCMS のタイトルが一覧表示される - アイテムをクリックすると本文が
TextBoxに表示される - (ボタンを付けていれば)「再読み込み」で最新情報を取得できる
という、シンプルなお知らせビューアが出来上がります。
CMS 側を更新するだけで、WinForms アプリにも反映される のがポイントです。
オンプレ・スタンドアロン環境でも “軽いクラウド化” が実現できます。
microCMS の本文(content)は、リッチエディタで作成された HTML がそのまま文字列として返ってきます。今回のサンプルでは、API 連携のシンプルさに焦点を当てたかったため、あえて TextBox に HTML を生のまま表示しています。
実際の業務用途では、HTML をそのまま描画できる「WebView2(Edge ベースのブラウザコンポーネント)」を使うことでmicroCMS の記事をそのままのレイアウトで表示できます。
7. この構成が役立つ場面
この「microCMS × C# WinForms」の構成が活きるのは、たとえばこんな場面がありそうかな・・
- 社内LAN向けの 簡易ポータル
- 現場端末での マニュアル閲覧ツール
- レガシーアプリに 「クラウドで管理する情報」だけ足したい
- メンテナンス担当者に 非エンジニアでも更新可能な CMS を渡したい
特に、既存の WinForms アプリが残っている現場では、「全部作り直し」は難しくても “お知らせだけクラウド化” という落とし所 が現実的かも。
8. 発展案
今回のサンプルをベースに、次のような発展ができると思う!
- HTML を
TextBoxではなく WebView2 でリッチ表示 - カテゴリ・検索機能の追加
- 画像・添付ファイル対応
- Draft モードと公開フラグに対応してプレビュー機能
- デスクトップ常駐アプリ化して、最新のお知らせをトレイアイコンからポップアップ表示
まとめ - 微妙と思いきや、microCMS × C# はかなり“アリ”
今回わかったのは、microCMS と C# の組み合わせは 次の理由で 「意外と相性が良い」 ということです。
- REST API が素直で、C# 側が苦労しない
- JSON が C# のデータモデルに綺麗にはまる
- SDK不要で HttpClient だけで普通に使える
- C# の事例が少ないため、現場の選択肢として価値が高い
JavaScript の CMS と思われがちな microCMS ですが、C# × WinForms のようなレガシー寄りの環境でも、「DX の入り口として効果的に機能しそうだな」 と感じました。
特に C# アプリは、製造業・金融・物流など オンプレ前提の現場に深く根付いているため、
「大規模リプレイスは無理だけど、情報更新だけクラウド化したい」
といった“現実的なDX”との相性がとても良いのがポイントです。
microCMS のように扱いやすい Headless CMS を組み合わせることで、レガシー環境でも無理なくクラウド要素を取り入れられるかも そんな手触りを感じられた検証でした。















