フロントエンド開発者の皆様へ(重要)
本表に記載されている「OpenAPI上の定義名」は、Swagger(YAML仕様書)内や自動生成されるプログラムコード(JSDoc等)で参照される技術的な管理名(スキーマ名)です。実際のAPIから返却されるJSONレスポンスの「キー名(プロパティ名)」としては直接登場しませんのでご注意ください(レスポンスは生のJSONオブジェクト構造として返却されます)。
CONTENTS API 仕様
本ドキュメントは、CONTENTS API v2.0 を利用して各エンドポイントの用途理解、コンテンツ一覧表示、ページネーション、高度なフィルタ検索、およびデータ描画を実装するフロントエンド開発者のための実戦向け完全統合仕様・開発ガイドブックです。
CONTENTS API 仕様書ファイルの提供について
本APIの完全な型定義およびエンドポイント仕様を含む仕様書をダウンロードいただけます。
ChatGPTやClaude等の生成AIへのインプット(プロンプト・コンテキスト用ファイル)としての活用や、各種自動生成ライブラリの入力ファイルとしてご活用ください。
1. 各エンドポイントの概要・用途(ユースケース)
フロントエンドの実装を行う際、どのAPIをどのような画面仕様やユースケースでコールすべきかを整理した「逆引き一覧ガイド」です。
エンドポイント別ユースケース早見表
| エンドポイント名 | パス (HTTPメソッド) | 主な用途・画面仕様 (ユースケース) | 開発時の重要ポイント |
|---|---|---|---|
| ① モデル定義取得 API | GET /v2/{contractId}/{apiendpoint}/definition |
・管理画面や検索画面の動的フィルターUI・入力フォームの構築 ・各フィールドの日本語名や型情報を画面描画前に一元取得したい場合 |
フィールドごとに検索で使用可能な比較演算子(ValidFilterOperators)が返るため、検索画面の演算子(完全一致、範囲指定など)を動的に制御するのに極めて有用です。 |
| ② コンテンツ詳細取得 API | GET /v2/{contractId}/{apiendpoint}/{contentId} |
・ブログ、FAQ、製品などの詳細・単一記事ページの描画 ・CMS管理者用の「下書き保存/非公開プレビュー」表示の実現 |
特定のIDで1件取得します。プレビューキー(PreviewKey)をHTTPヘッダーにセットすることで、下書き中・非公開ステータスのデータを安全に描画できます。 |
| ③ コンテンツ検索 API | GET /v2/{contractId}/{apiendpoint}/search |
・カード型グリッド、FAQ、記事などの一覧ページの描画 ・キーワード検索ボックスによるサジェスト・全文検索 ・カテゴリ/タグによる詳細な絞り込み表示 ・ページネーション(改ページ機能)、表示順ソートの制御 |
ページャ表示に必須となる PerPage と Page パラメータを使用します。検索条件(Filter などのオブジェクト)は、JSON文字列化してエンコードして送信します。 |
| ④ コンテンツ集計 API | GET /v2/{contractId}/{apiendpoint}/aggs |
・サイドバーのカテゴリ/タグ名の横に表示する「記事数カウント(例: お知らせ (15件))」の描画 ・現在の絞り込み条件(ファセット)におけるバケット別内訳の表示 |
検索APIと共通のフィルタ条件(Filter)を指定することで、現在の検索結果に合わせたカテゴリーごとの記事件数を瞬時に自動集計します。 |
| ⑤ カウント API (加算・減算) | POST /v2/{contractId}/{apiendpoint}/{contentId}/{fieldId}/count |
・記事の「いいね!」やお気に入り登録、閲覧数のリアルタイム加算(インクリメント)や減算(デクリメント) | 任意の加減数をリクエストボディ { "Value": 123 } に指定して送信します。負数を指定することで減算が可能です。 |
2. 開発の共通基本事項
① API接続先環境
- 本番環境 (Production):
https://api.contents.01core.app - βテスト環境 (Beta):
https://api.contents.beta.01core.dev
② 認証仕様について
本 API は、OpenAPI(YAML仕様書)上各エンドポイントに security: [] が明示されている通り、認証不要(公開API)です。フロントエンドからの通信時、Authorization ヘッダーを付与する必要はありません。
③【最重要】パラメータの命名規則(Casing)
バックエンドはパラメータ名の大文字・小文字を厳密にバリデーションします。ここを誤ると「パラメータが無視される」または「400 Bad Request」となります。
- パスパラメータ (Path Parameters):
camelCase(小文字開始)- 例:
contractId,apiendpoint,contentId
- 例:
- クエリパラメータ (Query Parameters):
PascalCase(大文字開始)- 例:
PerPage,Page,FullTextQuery,Filter,Sort,Operator
- 例:
3. 各API仕様
【1】モデル定義取得 API
コンテンツモデルのフィールド定義、型、および検索に使える比較演算子のメタデータを取得するAPIです。動的なフィルタUIや入力フォームの自動構築に利用します。
- HTTP メソッド:
GET - パス:
/v2/{contractId}/{apiendpoint}/definition
① レスポンス(200 OK)サンプル
{
"ID": "00000000-0000-0000-0000-000000000000",
"ApiName": "【サンプル】お知らせ・FAQマスタ",
"Fields": [
{
"ID": "11111111-1111-1111-1111-111111111111",
"FieldType": "Text",
"FieldName": "タイトル",
"FieldID": "Title",
"Sortable": true,
"EnableAggregate": false,
"Description": "コンテンツの主要な表示タイトルです。",
"Reference": {
"ApiEndpoint": "",
"FieldID": ""
},
"ValidFilterOperators": [
"equals"
]
},
{
"ID": "22222222-2222-2222-2222-222222222222",
"FieldType": "MultiReference",
"FieldName": "カテゴリ一覧",
"FieldID": "CategoryList",
"Sortable": false,
"EnableAggregate": true,
"Description": "関連する製品やサポートカテゴリのバインド情報(複数可)。",
"Reference": {
"ApiEndpoint": "categories_endpoint",
"FieldID": "11111111-1111-1111-1111-111111111111"
},
"ValidFilterOperators": [
"all_of",
"any_of"
]
},
{
"ID": "33333333-3333-3333-3333-333333333333",
"FieldType": "Checkbox",
"FieldName": "ステータスタグ",
"FieldID": "StatusTag",
"Sortable": false,
"EnableAggregate": false,
"Description": "NEWやSALEなどのフラグタグ情報。",
"Items": [
{
"ID": "44444444-4444-4444-4444-444444444444",
"Label": "NEW"
}
],
"Reference": {
"ApiEndpoint": "",
"FieldID": ""
},
"ValidFilterOperators": [
"all_of",
"any_of"
]
}
]
}
② スキーマ名と本ガイドにおける呼称の対応表
| 本ガイドでの呼び方 | OpenAPI上の定義名 | 概要 | 主要プロパティ |
|---|---|---|---|
| モデル定義(全体) | インライン定義 (Response) | モデルのメタデータ全体を取得するAPIの返却オブジェクト。 | ID, ApiName, Fields |
| フィールド定義 | インライン定義 (Object) | Fields 配列の各要素。型情報や条件が入ります。※ FieldType には、管理画面で定義・作成される全15種類の値(Text, Textarea, Editor, Number [数値/カウンター], Toggle, Picture, Checkbox, Radio, Dropdown, PhoneNumber, Address, Datetime, Reference, MultiReference)のいずれかが格納されます。 |
ID, FieldType, FieldName, FieldID, Sortable, EnableAggregate, ValidFilterOperators, Items, Reference |
| フィールドの参照先定義 | インライン定義 (Object) | Fields[].Reference 構造。別モデルとのバインド情報。 |
ApiEndpoint, FieldID |
| 選択肢マスタ定義(Items) | インライン定義 (Object) | Fields[].Items の各要素。DropdownやCheckboxのマスタ値。 |
ID, Label |
| 集計許可フラグ | EnableAggregate (Boolean) |
フィールドが集計(集約)対象となるかを判定するフラグ。管理画面の「集約対象」を「する」に設定することで true に切り替わり、集計APIの対象となります。 |
- |
| 有効な検索演算子 | ValidFilterOperators (Array) |
そのフィールドを用いた詳細フィルター(Filter)で利用可能な比較演算子のリスト(配列)。フロントでの動的UI構築や入力値検証の基準となります。 |
- |
③ スキーマ&データ構造・検索演算子 早見表
モデル定義取得API(/definition)から返却される Fields 配列内の各フィールドのデータ構造定義、およびそれに応じたフロントエンドでのUI・検索フォームの動的構築方針の一覧です。
| 管理画面の項目 | 返却される FieldType |
メタデータ構造(Items / Reference の返却構造) |
返却される ValidFilterOperators |
集計可能フラグ(EnableAggregate) |
フロントエンドでのUI動的構築・ハンドリング方針 |
|---|---|---|---|---|---|
| テキスト(1行) | Text |
Items: null, Reference: null |
["equals", "starts_with", "contains"] |
原則 false(集計対象外) |
1行の自由入力テキストボックス(<input type="text">)を動的に描画します。 |
| テキストエリア | Textarea |
Items: null, Reference: null |
[](空配列) |
原則 false(集計対象外) |
複数行入力対応のテキストエリア(<textarea>)を動的に描画します(詳細フィルタは非サポート)。 |
| リッチエディター | Editor |
Items: null, Reference: null |
[](空配列) |
原則 false(集計対象外) |
WYSIWYGなどのリッチテキストエディタを画面上に動的配置して初期化します(詳細フィルタは非サポート)。 |
| 数値 | Number |
Items: null, Reference: null |
["equals", "between"] |
true / false(管理画面設定で可変) |
範囲指定(Min / Max)に対応した数値スライダーや、前後に接頭辞・接尾辞用のラベルを伴う数値入力フォームを構築します。 |
| カウンター | Counter |
Items: null, Reference: null |
["equals", "between"] |
原則 false(集計対象外) |
画面上には「+」「ー」のステップボタンを備えた数量入力カウンターUIを動的レンダリングします。 |
| 画像 | Picture |
Items: null, Reference: null |
[](空配列) |
原則 false(集計対象外) |
ドラッグ&ドロップ対応の画像ファイルアップローダー、あるいはアセットライブラリ選択用のUIコンポーネントを構築します。 |
| チェックボックス | Checkbox |
Items: [ { "ID": "uuid", "Label": "ラベル" } ]Reference: null |
["any_of", "all_of"] |
true / false(管理画面設定で可変) |
Items 配列からマスタ選択肢をループ展開し、画面上に複数選択用のチェックボックスリストを動的レンダリングします。 |
| ラジオボタン | Radio |
Items: [ { "ID": "uuid", "Label": "ラベル" } ]Reference: null |
["equals"] |
true / false(管理画面設定で可変) |
Items 配列からマスタ選択肢を展開し、単一選択用ラジオボタンの選択メニューを動的描画します。 |
| ドロップダウン | Dropdown |
Items: [ { "ID": "uuid", "Label": "ラベル" } ]Reference: null |
["all_of", "any_of"] |
true / false(管理画面設定で可変) |
Items 配列からオプションリストを構築し、画面上のプルダウンメニュー(<select>および<option>)を動的生成します。 |
| トグルスイッチ | Toggle |
Items: null, Reference: null |
["equals"] |
true / false(管理画面設定で可変) |
ON/OFF制御用のスイッチコンポーネント、または単一チェックボックスを動的に構築します。 |
| 電話番号(3分割) | PhoneNumber |
Items: null, Reference: null |
["equals"] |
原則 false(集計対象外) |
市外局番、市内局番、加入者番号に対応する3分割されたテキスト入力ボックスを動的に並列描画します。 |
| 住所入力 | Address |
Items: null, Reference: null |
["equals"] |
true / false(管理画面設定で可変) |
郵便番号入力欄(自動住所検索連動ボタン付)から、都道府県・市区町村・番地・ビル名までの入力フォーム群をセットで動的描画します。 |
| 日時 | Datetime |
Items: null, Reference: null |
["equals", "between"] |
true / false(管理画面設定で可変) |
カレンダー形式の日付範囲ピッカー(Date Range Picker)を動的配置してバインドします。 |
| コンテンツ参照 | Reference |
Items: nullReference: { "ApiEndpoint": "参照先エンドポイント", "FieldID": "参照先FieldID" } |
["equals"] |
true / false(管理画面設定で可変) |
Reference.ApiEndpoint の情報を読み解き、裏で対応するマスタAPIからデータを非同期ロードして単一選択セレクトボックスにバインドします。 |
| 複数コンテンツ参照 | MultiReference |
Items: nullReference: { "ApiEndpoint": "参照先エンドポイント", "FieldID": "参照先FieldID" } |
["any_of", "all_of"] |
true / false(管理画面設定で可変) |
コンテンツ参照と同様に参照先APIからデータを自動ロードし、画面上の「タグピッカー」や複数選択可能UIに動的バインドします。 |
【2】コンテンツ詳細取得 API
特定のUUIDを指定して、1件のコンテンツ詳細データを取得します。詳細ページや、CMSから発行されるプレビューキー(PreviewKey)を利用した「下書き・非公開コンテンツのライブプレビュー」機能の構築に利用します。
- HTTP メソッド:
GET - パス:
/v2/{contractId}/{apiendpoint}/{contentId} - プレビューヘッダー:
PreviewKey: [UUID](任意)
① レスポンス(200 OK)サンプル
{
"UUID": "55555555-5555-5555-5555-555555555555",
"ID": "sample-content-id-001",
"CreatedAt": "2026-08-25T03:00:00Z",
"UpdatedAt": "2026-08-25T05:00:00Z",
"FieldValues": {
"Title": "【サンプル】よくあるタイトルのタイトル(ここにプレーンテキストのタイトル・お知らせタイトルが入ります)",
"Answer": "【サンプル】タイトルに対する簡易的な回答テキストです。プレーンテキストなので、シンプルなバインド描画に適しています。",
"AnswerDetail": "<div class=\"paragraph\">【サンプル】リッチテキストエディタで作成されたHTMLフォーマットの回答です。<br/>フロントエンドでは安全な手段を用いてパース・描画してください。</div>",
"StatusTag": ["NEW"],
"CategoryList": [
{
"ApiEndpoint": "categories_endpoint",
"ID": "66666666-6666-6666-6666-666666666666",
"DisplayValue": "カテゴリA"
}
],
"Date": "2026-08-25"
}
}
② スキーマ名と本ガイドにおける呼称の対応表
フロントエンド開発者の皆様へ(重要)
本表に記載されている「OpenAPI上の定義名」は、Swagger(YAML仕様書)内や自動生成されるプログラムコード(JSDoc等)で参照される技術的な管理名(スキーマ名)です。実際のAPIから返却されるJSONレスポンスの「キー名(プロパティ名)」としては直接登場しませんのでご注意ください(レスポンスは生のJSONオブジェクト構造として返却されます)。
| 本ガイドでの呼び方 | OpenAPI上の定義名 | 概要 | 主要プロパティ |
|---|---|---|---|
| コンテンツ詳細 / 結果の1件 | ContentV2 (Response) |
1件分のレコード構造。詳細APIのレスポンスそのものがこのスキーマで返却されます。 | UUID, ID, CreatedAt, UpdatedAt, FieldValues |
| 各属性データ(実体) | FieldValues (Object) |
コンテンツが保持する具体的なカスタム属性値(全15種類のフィールド値)が格納される連想配列オブジェクト。 | 動的なフィールドID(FieldID)をキーとする各データ値 |
| エラーレスポンス | ErrorMessage |
存在しないID指定や無効なプレビューキー指定時に返される共通メッセージ。 | message |
③ スキーマ&データ構造 早見表
詳細取得時に返却される FieldValues 内の各フィールドデータ構造とフロントエンドでの処理・レンダリング方針です。
参照系フィールドの ID(UUID)と IDAlias(コンテンツID)の混在に関する重要注意
- リクエスト(Filter 検索)時: 参照先コンテンツで絞り込む条件(
FilterのValueまたはValues)には、コンテンツの 内部 UUID を指定する必要があります。- レスポンス(
FieldValuesの参照オブジェクト)内: レスポンスに含まれるReferenceStructure.ID(例:CategoryList[].ID)には、内部 UUID ではなく、ユーザーが管理画面で定義した表示用/リンク用のIDAlias(コンテンツID) が返却されます(実装コード上の仕様となります)。- 実装方針: 表示や詳細ページへの遷移リンク構築(例:
/v2/.../{IDAlias})にはレスポンスのIDをそのまま使用できますが、再度の絞り込み(Filter)を組む際は内部 UUID を使用する必要がある点に注意してください。
選択肢系フィールドの超重要仕様(Checkbox / Radio / Dropdown)
APIのレスポンス(FieldValues)に含まれるCheckbox,Radio,Dropdownは、内部的なID(UUID)ではなく、画面表示用のLabel(文字列または文字列配列) で直接返却されます。
- Checkbox:
["Label1", "Label2"](文字列配列)- Radio:
"Label"(単一文字列)- Dropdown:
["Label1", ...](文字列配列)検索(
Filter)時はマスタ選択肢のID (UUID)を指定し、表示(レスポンス描画)時はLabelが返却される、という二面性を持っています。フロントエンド実装時にはこの使い分けを必ず意識してください。
日時フィールド(Datetime)のレスポンス形式に関する重要注意
- 管理画面の設定による可変仕様: 管理画面上の「日時タイプ」設定により、返却される日時データの形式が日付のみ(
YYYY-MM-DD形式、例:2026-08-25)、または秒・ミリ秒およびタイムスタンプを含む ISO8601 形式の日時(例:2026-08-25T03:00:00Z)に自動的に切り替わります。- サンプルの補足: レスポンスサンプル内の
"Date": "2026-08-25"は、管理画面で「日付のみ(YMD)」設定が適用されている場合の実データ構造です。- フロントエンド推奨実装: 返却される日時形式が日付・日時のどちらであっても画面崩れ等が発生しないよう、JSDocや型定義、またはJavaScriptの
DateオブジェクトやIntl.DateTimeFormatなどを経由して安全にパースおよび表示フォーマット(例:「2026年8月25日」や現地時間への変換)を行うロジックを実装してください。
| 管理画面の項目 | バックエンド型名 (FieldType) |
レスポンスデータ型 & 構造 | フロントエンド処理方針(レンダリングのコツ) |
|---|---|---|---|
| テキスト(1行) | Text |
String (文字列) |
そのまま画面にテキストバインドします。 |
| テキストエリア | Textarea |
String (文字列) |
white-space: pre-wrap; などのCSSを適用し、改行を保持した状態で画面にテキストバインドします。 |
| リッチエディター | Editor |
String (生HTML文字列) |
XSSに注意し、HTMLパーサーやVueの v-html、Reactの dangerouslySetInnerHTML などを利用して安全にレンダリングします。 |
| 数値 | Number |
NumberStructure オブジェクト{ "Prefix": "¥", "Suffix": "(税込)", "Value": 1500 } |
第4章のユーティリティ関数 formatCurrency() を適用し、3桁カンマ区切り、接頭辞、接尾辞を付与して整形描画します。 |
| カウンター | Counter |
NumberStructure オブジェクト{ "Prefix": "", "Suffix": "個", "Value": 5 } |
カウンター値も数値と同様に NumberStructure で返ります。ユーティリティを適用するか、Value を直接参照してバインドします。 |
| 画像 | Picture |
PictureStructure オブジェクト{ "URL": "https://...", "Alt": "代替テキスト", "Caption": "説明" } |
<img> タグの src に URL、alt に Alt をバインドし、必要に応じてキャプションを下にレンダリングします。 |
| チェックボックス | Checkbox |
Array of Strings (文字列の配列)[ "Label1", "Label2" ] |
重要仕様: IDではなく画面表示用のLabel文字列が配列で直接返却されます(例:["NEW", "SALE"])。配列をループ処理し、そのまま画面上にバッジ形式でレンダリングします。 |
| ラジオボタン | Radio |
String (単一のLabel文字列)"Label" |
重要仕様: IDではなく選択された項目のLabel文字列(例:"Label1")が直接返却されます。そのまま画面にテキストバインドします。 |
| ドロップダウン | Dropdown |
Array of Strings (文字列の配列)[ "Label1" ] |
重要仕様: IDではなく選択された項目のLabel文字列の配列(例:["選択肢A"])が返却されます。配列の最初の要素を参照してバインドします。 |
| トグルスイッチ | Toggle |
Boolean (真偽値: true / false) |
v-if / v-show などの条件分岐や、画面上のスイッチUIのON/OFF表示を切り替えるフラグとして使用します。 |
| 電話番号(3分割) | PhoneNumber |
Array of Strings[ "03", "1234", "5678" ] |
文字列配列として返るため、.join('-') を用いてハイフンで安全に結合し、03-1234-5678 の形式で画面に描画します。 |
| 住所入力 | Address |
AddressStructure オブジェクト{ "ZipCode": "100-0001", "Prefecture": "東京都", "Municipality": "千代田区", "StreetNumber": "1-1", "BuildingName": "" } |
第4章のユーティリティ関数 formatAddress() を用いて、郵便番号から番地・ビル名までを1つの読みやすい文字列に結合して描画します。 |
| 日時 | Datetime |
String (日付形式 "2026-08-25" または ISO8601 タイムスタンプ) |
JavaScript標準の Intl.DateTimeFormat や new Date() を用いてパースし、日付のみと日時の双方に安全に対応して整形・描画します。 |
| コンテンツ参照 | Reference |
ReferenceStructure オブジェクト{ "ApiEndpoint": "faq_category", "ID": "id_alias", "DisplayValue": "カテゴリ名" } |
DisplayValue をリンク付きのカテゴリバッジとして直接描画します。リンク先URLには ApiEndpoint と返却された ID (IDAlias) を用いて遷移を制御します。 |
| 複数コンテンツ参照 | MultiReference |
Array of Objects[ { "ApiEndpoint": "faq_tag", "ID": "uuid", "DisplayValue": "タグ名" } ] |
DisplayValue をループ処理して、画面上の関連タグや関連記事リンクの一覧として直接マッピング描画します。追加のAPI問い合わせは不要です。 |
【3】コンテンツ検索 API
条件にヒットするコンテンツ一覧の取得、全文キーワード検索、精密なフィルタリング、ページネーション、ソート順の制御を行う、一覧表示画面の主役となるAPIです。
- HTTP メソッド:
GET - パス:
/v2/{contractId}/{apiendpoint}/search - パラメータ:
PerPage,Page,FullTextQuery,Filter,Sort,Operator
① レスポンス(200 OK)サンプル
{
"TotalCount": 25,
"PerPage": 10,
"Page": 0,
"Contents": [
{
"UUID": "77777777-7777-7777-7777-777777777777",
"ID": "sample-content-id-002",
"CreatedAt": "2026-07-27T09:00:00Z",
"UpdatedAt": "2026-07-27T09:00:00Z",
"FieldValues": {
"Title": "【サンプル】初期ログイン方法について教えてください。",
"Answer": "【サンプル】登録確認メールに記載された仮パスワードを使用し、ログインした上でプロフィールの設定を行ってください。",
"CategoryList": [
{
"ApiEndpoint": "categories_endpoint",
"ID": "88888888-8888-8888-8888-888888888888",
"DisplayValue": "初期サポート"
}
]
}
}
]
}
② スキーマ名と本ガイドにおける呼称の対応表
フロントエンド開発者の皆様へ(重要)
本表に記載されている「OpenAPI上の定義名」は、Swagger(YAML仕様書)内や自動生成されるプログラムコード(JSDoc等)で参照される技術的な管理名(スキーマ名)です。実際のAPIから返却されるJSONレスポンスの「キー名(プロパティ名)」としては直接登場しませんのでご注意ください(レスポンスは生のJSONオブジェクト構造として返却されます)。
| 本ガイドでの呼び方 | OpenAPI上の定義名 | 概要 | 主要プロパティ |
|---|---|---|---|
| 検索結果全体 | インライン定義 (Response) | ページングメタデータと合致コンテンツ配列を内包したレスポンス全体。 | TotalCount, PerPage, Page, Contents |
| 検索結果の1件分 | ContentV2 (Object) |
合致レコードの配列(Contents)の構成要素となる1件分のオブジェクト。 |
UUID, ID, CreatedAt, UpdatedAt, FieldValues |
| 各属性データ(実体) | FieldValues (Object) |
検索結果の各コンテンツが持つ具体的なカスタム属性値(全15種類のフィールド値)が格納される連想配列オブジェクト。 | 動的なフィールドID(FieldID)をキーとする各データ値 |
| 絞り込み条件(クエリ) | Filter |
詳細なフィルタ検索をかける際に Filter パラメータに渡すJSON。 |
Operator, Conditions |
| 全文検索条件(クエリ) | SearchFullTextQuery |
キーワード曖昧検索時に FullTextQuery に渡すJSON。 |
Keywords, Operator |
| 並び替え条件(クエリ) | Sort |
ソート条件を指定する際に Sort に渡すJSON配列。 |
Key, Order |
③ スキーマ&データ構造・検索演算子 早見表
検索リクエストのクエリ(Filter)を構築する際、指定した FieldID に対して利用可能な比較演算子、および送信すべき検索値(Value / Values / Range)の具体的なデータ構造です。
| 管理画面の項目 | バックエンド型名 | 検索対応演算子 (Operator) |
送信する検索値(Value / Values / Range)のJSON構造 |
|---|---|---|---|
| テキスト(1行) | Text |
equals, starts_with, contains |
一致 Value: "キーワード" (String)、部分一致・前方一致もサポート |
| テキストエリア | Textarea |
なし | 原則として詳細フィルタの対象外(全文検索 FullTextQuery を使用します) |
| リッチエディター | Editor |
なし | 詳細フィルタの対象外(全文検索の対象には含まれます) |
| 数値 | Number |
equals, between |
完全一致 Value: 1000 または 範囲 Range: {"Min": 1000, "Max": 5000} |
| カウンター | Counter |
equals, between |
完全一致 Value: 5 または 範囲 Range: {"Min": 1, "Max": 10} (API上は Counter タイプとして識別されます) |
| 画像 | Picture |
なし | フィルター検索の対象外 |
| チェックボックス | Checkbox |
any_of, all_of |
Values: ["選択肢A_ID", "選択肢B_ID"] (Stringの配列) |
| ラジオボタン | Radio |
equals |
単一一致は Value: "選択肢のID (UUID)" (String) |
| ドロップダウン | Dropdown |
all_of, any_of |
Values: ["選択肢A_ID", "選択肢B_ID"] の配列形式で絞り込みを指定します。 |
| トグルスイッチ | Toggle |
equals |
Value: true / false (※厳密なBoolean型) |
| 電話番号(3分割) | PhoneNumber |
equals |
Value: "03-1234-5678" (String) |
| 住所入力 | Address |
equals |
Value: "東京都" (都道府県名などのString完全一致) |
| 日時 | Datetime |
equals, between |
完全一致 Value: "2026-07-01" または 範囲 Range: {"Min":
"2026-07-01T00:00:00Z", "Max": "2026-07-31T23:59:59Z"} |
| コンテンツ参照 | Reference |
equals |
Value: "参照先コンテンツのUUID" (String) |
| 複数コンテンツ参照 | MultiReference |
any_of, all_of |
Values: ["UUID-1", "UUID-2"] (複数参照先UUIDのString配列) |
④ 全文検索(FullTextQuery)仕様
キーワード入力によるコンテンツ全体の横断的な曖昧検索(全文検索)を処理するパラメータです。
- 除外検索のサポート (
exclude):FullTextQueryのOperatorには、通常の曖昧検索を表すfuzzy_matchの他に、指定したキーワードを検索対象から除外するexcludeも指定可能です。{ "Keywords": "広告 キャンペーン", "Operator": "exclude" } - 全文検索インデックスの有効化条件:
FullTextQueryによる検索(部分一致やキーワードマッチ)を有効にするためには、管理画面のコンテンツモデルのフィールド詳細設定で「全文検索対象」を「する」に設定しておく必要があります。 - 挙動とフィルタ制限のクリア:
- 管理画面で「全文検索対象」を「する」に設定したフィールドのみが、バックエンドの検索エンジンにおいて逆インデックス(全文検索用インデックス)の対象として処理されます。
- 「しない」に設定されているフィールドは、たとえテキスト(
Text,Textarea,Editor)型であってもFullTextQueryの検索キーワードのマッチング対象から完全に除外されます。 - 詳細フィルタ(
Filter)をサポートしていないテキストエリア(Textarea)やリッチエディタ(Editor)は、この「全文検索対象」を「する」に設定してFullTextQueryで検索を受け付けるのが原則的な仕様となります。
⑤ ページネーション(TotalCount, PerPage, Page)仕様
検索結果レスポンスの一番外側(インライン定義 (Response))に含まれる、ページネーション表示と制御を実装するための必須メタデータ群です。
- 各メタデータの定義:
TotalCount(Integer): 検索条件(FilterやFullTextQuery)に合致する、データベース内の該当コンテンツの「総件数」です。PerPage(Integer): 1ページあたりに取得する最大件数です。省略時のデフォルト値は20、1リクエストあたりの最大取得制限値は100です。リクエスト時に送信したPerPageの値がそのままレスポンスでも現在の適用値として返却されます。Page(Integer): 現在取得しているページ位置(0から始まるインデックス:0-based)です。リクエスト時に送信したPageの値がそのまま返却されます。
- フロントエンド実装時の活用方針:
- 総ページ数(TotalPages)の計算:
画面上に「全〇ページ」を表示するための総ページ数は、以下の計算式で動的に算出します。TotalPages = Math.ceil(TotalCount / PerPage) - UI表示(1始まり)とAPI(0始まり)の相互変換:
APIはPage=0を1ページ目として処理するため、フロントエンドのUI上の表示(ページ1, ページ2...)と連動させる際は、APIリクエスト時に必ず UIの表示ページ数 - 1 を行い、レスポンス描画時には Page + 1 を行って画面にバインドします。 - 「前へ」「次へ」ボタンの活性/非活性制御:
- 「前へ(Previous)」ボタンの有効条件:
Page > 0 - 「次へ(Next)」ボタンの有効条件:
Page < (TotalPages - 1)
- 「前へ(Previous)」ボタンの有効条件:
- 総ページ数(TotalPages)の計算:
【4】コンテンツ集計 API
指定した条件(Filter / FullTextQuery)に一致するコンテンツについて、フィールドの値ごとの件数を集計して返します。絞り込みUIで「東京都 (12)」のように件数を出したい場合などに使用します。
- HTTP メソッド:
GET - パス:
/v2/{contractId}/{apiendpoint}/aggs - パラメータ:
FullTextQuery,Filter,OperatorFullTextQuery/Filter/Operatorは、コンテンツ検索APIと同じ形式・同じ渡し方(JSON文字列をURLエンコード)です。
- 集計仕様:
- 集計対象:
EnableAggregate: trueのフィールドのみ(モデル定義取得APIで確認)。
※集計を実行するためには、管理画面のコンテンツモデルのフィールド詳細設定で「集約対象」を「する」に設定しておく必要があります。これによってAPIレスポンス上でEnableAggregate: trueとなり、集計可能になります。設定が「しない」(EnableAggregate: false)になっているフィールドは集計対象外となり、レスポンスのResultには含まれません。 - 取得上限: 1フィールドあたり上位100件(※ただし、日時フィールドは上限なし)
- 集計対象:
① レスポンス(200 OK)サンプル
{
"Result": {
"CategoryList": {
"66666666-6666-6666-6666-666666666666": 32,
"88888888-8888-8888-8888-888888888888": 25,
"99999999-9999-9999-9999-999999999999": 14
}
}
}
② スキーマ名と本ガイドにおける呼称の対応表
| 本ガイドでの呼び方 | OpenAPI上の定義名 | 概要 | 主要プロパティ・クエリ |
|---|---|---|---|
| 集計結果全体 | インライン定義 (Response) | 集計結果を含むレスポンスオブジェクト。 | Result (フィールドIDをキー、値と件数のマップを値とするオブジェクト) |
| 絞り込み条件(クエリ) | Filter |
集計対象となる母集団データを絞り込むための詳細フィルター(検索APIと同じ形式、JSON文字列をURLエンコード)。 | Operator, Conditions |
| 全文検索条件(クエリ) | SearchFullTextQuery |
集計対象となる母集団データを全文検索で絞り込むためのキーワード(検索APIと同じ形式、JSON文字列をURLエンコード)。 | Keywords, Operator |
③ スキーマ&データ構造・集計仕様 早見表
集計APIから返却される集計結果(Result)のデータ型ごとの集計仕様およびフロントエンドでの描画方針です。
| 管理画面の項目 | バックエンド型名 | 集計仕様 & 取得上限 | 返却されるキーと値の形式 & 描画方針 |
|---|---|---|---|
| テキスト(1行) | Text |
原則集計対象外 | EnableAggregate: false のため集計対象外。 |
| テキストエリア | Textarea |
原則集計対象外 | 集計対象外。 |
| リッチエディター | Editor |
集計対象外 | 集計対象外。 |
| 数値 | Number |
EnableAggregate: true のみ上位100件まで |
"数値文字列": 件数 (Integer)金額やスコア等の分布ヒストグラムなどの可視化。 |
| カウンター | Counter |
同上 上位100件まで |
"数値文字列": 件数数値(Counter)と同様、各カウント値ごとの記事件数を集計。 |
| 画像 | Picture |
集計対象外 | 集計対象外。 |
| チェックボックス | Checkbox |
EnableAggregate: true のみ上位100件まで |
"[選択肢のID/Label]": 件数複数選択されたオプションごとの選択割合・件数バッジの描画。 |
| ラジオボタン | Radio |
同上 上位100件まで |
"[選択肢のID/Label]": 件数単一選択肢ごとの件数・内訳比率チャートの描画。 |
| ドロップダウン | Dropdown |
同上 上位100件まで |
"[選択肢のID/Label]": 件数サイドバーのドロップダウンメニューの各項目横に記事件数バッジを表示。 |
| トグルスイッチ | Toggle |
同上 上位100件まで |
"true": 件数, "false": 件数「有効/無効」や「公開/非公開」の比率チャートの描画。 |
| 電話番号(3分割) | PhoneNumber |
原則集計対象外 | 集計対象外。 |
| 住所入力 | Address |
同上 上位100件まで |
"[住所・都道府県文字列]": 件数都道府県別のアクティブユーザー分布数などの集計表示。 |
| 日時 | Datetime |
同上 上限なし(無制限) |
"YYYY-MM-DD": 件数時系列トレンド(月別、日別の記事件数推移)を折れ線グラフで網羅的に表示。 |
| コンテンツ参照 | Reference |
同上 上位100件まで |
"[参照先コンテンツのUUID]": 件数連携カテゴリごとの記事件数バッジの描画(例: 共通 (12))。 |
| 複数コンテンツ参照 | MultiReference |
同上 上位100件まで |
"[参照先タグのUUID]": 件数サイドバーのタグクラウドや、タグ一覧の横に記事カウントを表示。 |
【5】カウント API (Count Update)
特定のコンテンツ内の、指定された Counter(カウンター)型フィールドの数値をリアルタイムに更新(加算または減算)します。記事の「いいね!」数、お気に入り登録数、簡易的なページビュー数の加減算など、バックエンド側の中介サーバーを介さずにフロントエンドから直接カウンターを増減させるユースケースに最適です。
- HTTP メソッド:
POST - パス:
/v2/{contractId}/{apiendpoint}/{contentId}/{fieldId}/count - パラメータ(Path Parameters):
contractId(Path / UUID) : 契約ID (必須)apiendpoint(Path / String) : 対象のAPIエンドポイント名 (必須)contentId(Path / String) : 対象コンテンツのID (IDAlias または UUID) (必須)fieldId(Path / String) : カウンター値を加算・減算したいCounter型フィールドのID (必須)
- リクエストボディ (Required):
- コンテンツタイプ:
application/json - データ構造:
{ "Value": 1 }Value(Integer / 必須): 加算または減算する数値。正の整数(例:1)を指定した場合は加算(インクリメント)、負の整数(例:-1)を指定した場合は減算(デクリメント)となります。
- コンテンツタイプ:
- レスポンス(200 OK):
加算・減算処理が適用された後の「カウンター」フィールド情報が以下のJSON構造で返却されます。{ "Prefix": "", "Suffix": "回", "Value": 124 }Prefix(String / 必須): 管理画面で設定された接頭辞Suffix(String / 必須): 管理画面で設定された接尾辞Value(Integer / 必須): 加算・減算処理適用後の最終カウンター数値
- エラーレスポンス & 例外処理:
400 Bad Request: リクエスト内容が不適切、または必須項目が不足しています。contractId/apiendpoint/contentId/fieldIdが未指定の場合(message: "'[parameter]' is required.")。- 加算する数値(
Value)がリクエストボディに指定されていない、または整数以外の不正なデータ型が送信された場合(error.message: "ValidationErrors",field: "Value")。 - リクエストボディ自体が不適切な場合(
message: "Invalid request body.")。
404 Not Found:- 指定されたコンテンツが存在しない場合(
message: "NOT_FOUND")。 - 指定されたフィールドが存在しない、あるいはそのフィールドが
Counterタイプではない場合(message: "'fieldId' is not found.")。
- 指定されたコンテンツが存在しない場合(
409 Conflict:- カウント更新後の最終数値がシステム上限値(20億)を超える、または下限値(-20億。管理画面で「負数を許可しない」設定の場合は0)を下回る場合(
message: "'fieldId' value exceeds the count limit or is below the minimum.")。
- カウント更新後の最終数値がシステム上限値(20億)を超える、または下限値(-20億。管理画面で「負数を許可しない」設定の場合は0)を下回る場合(
500 Internal Server Error:- サーバー側で予期せぬエラーが発生した場合(
message: "An unexpected error has occurred")。
- サーバー側で予期せぬエラーが発生した場合(
503 Service Unavailable:- 同時多発的なカウント処理集中などにより、一時的にリソース不足が発生した場合(
message: "A temporary error has occurred, Please try again.")。
- 同時多発的なカウント処理集中などにより、一時的にリソース不足が発生した場合(
- 挙動とセキュリティ設計:
本 API は公開用(認証不要)としてフロントエンドから直接コールできるように設計されていますが、同一クライアントからの連続F5連打多重投稿や自動ボットによる過剰な不正リクエスト(スパム行為)から保護するため、API Gatewayレイヤーにおいて自動的にレートリミット(流量制限)が適用されます。 確実な保護のため、フロントエンドUIでもボタンのデバウンス(多重クリック防止)や通信中の非活性化(disabled)処理を併せて実装することを推奨します。
4. 開発者向けガイドライン
① コンテンツのFieldTypeとデータ構造の対応表
標準JavaScript(ES6+)での開発において、エディタ(VS Code等)のコード補完・入力を自動有効化する JSDocアノテーション、および返却された複雑なデータ構造を画面に美しく出力するための実用処理ユーティリティ(バニラJS)です。
// ── 1. JSDoc型定義(VS Code等の入力補完を自動有効化します) ──
/**
* @typedef {Object} NumberStructure
* @property {string} Prefix - 接頭辞 (例: "¥")
* @property {string} Suffix - 接尾辞 (例: "(税込)")
* @property {number} Value - 数値
*/
/**
* @typedef {Object} PictureStructure
* @property {string} URL - 画像のアセットURL
* @property {string} Alt - 代替テキスト
* @property {string} Caption - 画像キャプション
*/
/**
* @typedef {Object} AddressStructure
* @property {string} ZipCode - 郵便番号 (ハイフンあり)
* @property {string} Prefecture - 都道府県
* @property {string} Municipality - 市区町村
* @property {string} StreetNumber - 番地
* @property {string} BuildingName - ビル・マンション名 (任意)
*/
/**
* @typedef {Object} ReferenceStructure
* @property {string} ApiEndpoint - 参照先APIエンドポイント
* @property {string} ID - 参照データのUUID
* @property {string} DisplayValue - 参照データ側の表示用名称
*/
// ── 2. JavaScript実用フォーマッター(そのままコピーしてUIコンポーネントで使えます) ──
/**
* 住所オブジェクト(AddressStructure)を1つの読みやすい文字列に結合します
* @param {AddressStructure} address
* @returns {string} 結合された住所文字列
*/
export function formatAddress(address) {
if (!address) return '';
const { ZipCode, Prefecture, Municipality, StreetNumber, BuildingName } = address;
const mainAddress = `${Prefecture || ''}${Municipality || ''}${StreetNumber || ''}`;
const bName = BuildingName ? ` ${BuildingName}` : '';
return ZipCode ? `〒${ZipCode} ${mainAddress}${bName}` : `${mainAddress}${bName}`;
}
/**
* 金額や数値(NumberStructure)をカンマ区切りし、接頭辞・接尾辞を付与して整形します
* @param {NumberStructure} numObj
* @returns {string} フォーマットされた金額表示(例: "¥1,500(税込)")
*/
export function formatCurrency(numObj) {
if (!numObj || numObj.Value === undefined) return '';
// 日本の3桁区切り(カンマ)フォーマッター
const formattedValue = new Intl.NumberFormat('ja-JP').format(numObj.Value);
return `${numObj.Prefix || ''}${formattedValue}${numObj.Suffix || ''}`;
}
/**
* HTMLタグ(Editor型など)からプレーンテキストを安全に抽出します(文字数制限等に便利)
* @param {string} htmlString
* @returns {string} タグが除去されたプレーンテキスト
*/
export function stripHtmlTags(htmlString) {
if (!htmlString) return '';
return htmlString.replace(/<\/?[^>]+(>|$)/g, "");
}
② コンテンツ検索クエリ構築とページネーションの完全設計
コンテンツ検索 API (/v2/.../search) で、高度な一覧画面を完璧に構築するための設計書です。
【最重要】JSONオブジェクトのシリアライズとURLエンコード
クエリパラメータ(FullTextQuery, Filter, Sort)は、すべて複雑な入れ子構造のJSONオブジェクトです。これらをHTTP GETリクエストのクエリパラメータとして安全に送信するためには、以下の2ステップの処理が必須となります。
- JSON文字列化(シリアライズ): JavaScriptの
JSON.stringify(object)を用いて、オブジェクトをJSON形式のテキスト文字列に変換します。 - URLエンコード(URIエンコード):
encodeURIComponent(jsonString)やURLSearchParamsなどの標準ユーティリティを使用して、必ずURLセーフな文字列(パーセントエンコーディング形式)に変換します。
なぜURLエンコードが必須なのか?
URLにはスペースやダブルクォーテーション(")、波括弧({})、コロン(:)、カンマ(,)といった文字はそのまま含められません。エンコードを怠ると、WebブラウザやHTTPクライアントライブラリでリクエストが破損し、バックエンド側でJSONパースエラー(400 Validation Error)が発生する致命的な原因となります。
1. ページネーション(PerPage / Page)のパラメータ制御
一覧表示件数の制限と取得するページ位置の指定には、PerPage と Page クエリパラメータを使用します。PerPage パラメータを省略、または未指定(null)にした場合のデフォルトの表示件数は 20 件、1リクエストあたりの最大取得制限値は 100 件です。
インデックスは「0(ゼロ)始まり」
バックエンドの仕様上、ページ番号を示す Page パメータは 0始まり(0-based index) です。フロントエンドのUI(1ページ目、2ページ目...)と連動させる際は、必ず -1の変換処理 を行ってリクエストを送信してください。
リクエストクエリの対比 (1ページあたり10件表示の場合)
- 【UI上の第 1 ページ】を表示する場合:
GET /v2/{contractId}/{apiendpoint}/search?PerPage=10&Page=0 - 【UI上の第 2 ページ】を表示する場合:
GET /v2/{contractId}/{apiendpoint}/search?PerPage=10&Page=1
2. 全文検索 (FullTextQuery) のJSON構造
モデル内の「全文検索対象: する」に設定されたすべてのテキスト系フィールドを対象に、スペース区切りのキーワード群で曖昧検索を行います。
※管理画面での「全文検索対象」の設定状況は、APIの内部検索インデックスに直結します。
{
"Keywords": "ログイン 二要素認証",
"Operator": "fuzzy_match"
}
3. 詳細フィルタリング (Filter) のOperator別JSON構造例
フィルタをかける際は、論理結合を表すトップレベルの Operator(and または or)の中に、Conditions という配列を持ちます。その各要素の中で、比較演算子(Operator)を使い分けます。
A. equals (完全一致演算子) の構造例
テキストの完全一致、Toggle型の真偽値一致、UUID/IDの完全一致で使用します。
・例: 有効(ON)かつ特定のカテゴリID(UUID)を持つコンテンツを抽出する条件
{
"Operator": "and",
"Conditions": [
{
"FieldID": "StatusToggle",
"Operator": "equals",
"Value": true
},
{
"FieldID": "CategoryList",
"Operator": "any_of",
"Values": ["66666666-6666-6666-6666-666666666666"]
}
]
}
・ポイント: Toggle型のフィールドにマッチさせる Value には、文字列の "true" ではなくBooleanの true / false を渡します。また、UUID や ID 型も同様に equals で完全一致指定できます。
B. any_of / all_of (配列一致演算子) の構造例
チェックボックスやマルチ参照、ドロップダウンなど、「選択されたいずれか(またはすべて)」に一致させる場合に使用します。
・例: 「ステータスタグ」のいずれか(複数可)に一致するコンテンツを抽出する条件
{
"Operator": "and",
"Conditions": [
{
"FieldID": "StatusTag",
"Operator": "any_of",
"Values": [
"status_tag_uuid_0001",
"status_tag_uuid_0002"
]
}
]
}
・ポイント: 検索キーワードや単一値の Value ではなく、Values という複数形(Stringの配列)をキーとして値を指定する必要があります。
C. between (範囲指定演算子) の構造例
数値や日付・日時の範囲を指定して絞り込む場合に使用します。
・例: 価格が 1,000円から5,000円 の範囲のコンテンツを抽出する条件
{
"Operator": "and",
"Conditions": [
{
"FieldID": "Price",
"Operator": "between",
"Range": {
"Min": 1000,
"Max": 5000
}
}
]
}
・ポイント: 単一の値ではなく、Range オブジェクトを指定し、その中に Min と Max という境界となるキーをセットします。
4. ソート順の制御 (Sort) のJSON構造
表示順の並び替え条件を、優先度順に配列形式で指定します。
[
{ "Key": "CreatedAt", "Order": "desc" },
{ "Key": "SortOrder", "Order": "asc" }
]
ソート(Sort)パラメータ未指定時のデフォルト挙動
APIリクエスト時に Sort パラメータを省略、または未指定(null)にした場合、バックエンド側では自動的に以下の優先順位でデフォルトのソートロジックが適用されます。
FullTextQueryまたはFilterのいずれかが指定されている場合:- 関連度(Relevance)順の降順で自動的にソートされます。キーワードのマッチ度やフィルタへの合致度が高いコンテンツが優先的に上位に表示されます。
FullTextQueryとFilterの双方が未指定(全件取得など)の場合:- 第一ソートキー:
UpdatedAtの降順(最終更新日時が新しい順) - 第二ソートキー:
IDの昇順 - これにより、「最近更新されたコンテンツから順に並び、同一日時の場合はID順」に並ぶことが保証されます。
- 第一ソートキー:
フロントエンド側で明示的な並び替えUI(例:「価格が安い順」など)を提供しないデフォルト表示時においては、この暗黙の優先挙動を前提にして一覧レイアウトを設計・確認することが可能です。
5. フロントエンド(JavaScript / fetch)での一覧・ページネーション実装例
外部ライブラリに依存せず、ブラウザ標準の fetchAPI を用いてパラメータを安全にエンコード・シリアライズし、非同期通信(async/await)で一覧データを取得する、そのままコピー&ペーストして使える堅牢な実用コード例です。
/**
* ページ指定によるコンテンツ検索一覧の取得 (fetch API 最終決定版)
* @param {number} pageUi - UI上でユーザーがクリックしたページ番号 (1, 2, 3...)
* @param {number} perPage - 1ページあたりの表示件数
* @param {string} categoryUuid - 絞り込みたいカテゴリのUUID (任意)
* @returns {Promise<Object>} APIから返却されたJSONデータ
*/
async function fetchContentsList(pageUi = 1, perPage = 10, categoryUuid = null) {
// ① UI上のページ番号(1始まり)を、APIの仕様(0始まり)に変換
const apiPage = pageUi - 1;
// ② 詳細フィルタのオブジェクト構築
const filterConditions = [];
if (categoryUuid) {
filterConditions.push({
FieldID: "CategoryList",
Operator: "any_of", // MultiReference は equals 非対応のため any_of を使用
Values: [categoryUuid] // 複数一致条件(配列形式)で指定します
});
}
const filterObj = {
Operator: "and",
Conditions: filterConditions
};
const sortObj = [{ Key: "CreatedAt", Order: "desc" }];
// ③ パラメータの組み立て
// ※ URLSearchParamsに渡す各パラメータオブジェクトは、必ず事前に JSON.stringify() でシリアライズします。
// ※ URLSearchParamsはブラウザ標準仕様で、これらを自動的かつ安全にURLエンコード(百分率エンコーディング)します。
const params = new URLSearchParams({
PerPage: perPage.toString(),
Page: apiPage.toString(),
Sort: JSON.stringify(sortObj)
});
if (filterConditions.length > 0) {
params.append('Filter', JSON.stringify(filterObj));
}
const contractId = "YOUR_CONTRACT_ID";
const apiendpoint = "sample_endpoint";
const url = `https://api.contents.01core.app/v2/${contractId}/${apiendpoint}/search?${params.toString()}`;
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});
if (!response.ok) {
// 400 Validation Errorや401, 404などのエラーハンドリング
const errorData = await response.json().catch(() => ({}));
throw new Error(errorData.message || `HTTP error! status: ${response.status}`);
}
const data = await response.json();
// 返却データ構造: { TotalCount: 13, PerPage: 10, Page: 0, Contents: [...] }
return data;
} catch (error) {
console.error('API一覧取得に失敗しました:', error.message);
throw error;
}
}
// ── ページネーションUI制御ロジックの計算例 ──
function calculatePaginationState(totalCount, perPage, apiPage) {
const totalPages = Math.ceil(totalCount / perPage);
const currentPageUi = apiPage + 1; // 0始まりから1始まりに変換
const hasPrevious = apiPage > 0;
const hasNext = apiPage < (totalPages - 1);
return { totalPages, currentPageUi, hasPrevious, hasNext };
}
6. よくあるトラブルとQ&A(Troubleshooting)
原因: クエリパラメータのキー名が perPage や page のように小文字(camelCase)になっている、あるいはタイポがある可能性があります。
解決策: バックエンドは正確な PascalCase (大文字開始: PerPage, Page) しか受け付けません。パラメータの大文字・小文字を一字一句正確に確認してください。
原因:
Toggle型のフィールドに対して、Value: "true"(文字列型)を渡している。Radioフィールドに対して配列のValues、あるいはDropdownフィールドに対して単一のValueを送信するなど、サポート外の比較演算子や形式を指定している(例:Radio はequalsのみ対応、Dropdown はall_of/any_ofのみ対応)。- JSONオブジェクトを
JSON.stringify()で文字列化せずに、生のJavaScriptオブジェクトのままfetchのクエリパラメータにセットして送信している。
解決策:
Toggleフィールドには、必ず厳密なBoolean型のtrue/falseを指定してください。- 各データ型が対応する演算子(Radio =
equals, Dropdown =any_of/all_of)に完全に適合したパラメータ構成(ValueまたはValues)となっているかを、モデル定義APIの「ValidFilterOperators」と照らし合わせて確認してください。 - クエリパラメータに渡す際は、必ずオブジェクトを文字列化(シリアライズ)し、
URLSearchParams等を使用してURIエンコードされた安全な形式で送信してください。
原因: フロントエンド側でUI上のページ番号(2)を、そのままAPIの Page パラメータに渡している可能性があります。
解決策: APIの仕様は Page=0 が1ページ目、Page=1 が2ページ目となります。API呼び出しの直前でUIページ数 -1の減算処理を行っているかソースコードを確認してください。
回答: 本 API(v2 公開API)は security: [] 定義の認証不要なエンドポイントであるため、通常フロントからの利用時に 401 などの認証エラーは発生しません。もし発生する場合は、APIゲートウェイの手前でのネットワークルーティング設定や、エンドポイントURLが誤っている可能性がありますので、API接続先環境のURLを一字一句正確に確認してください。