aspidaで型定義してmicroCMSのAPIにアクセスする
Next.jsReactTypeScriptmicroCMS
Published
Updated

aspidaで型定義してmicroCMSのAPIにアクセスする

aspidaを導入

インストール

yarn add @aspida/fetch

使用するAPIスキーマ

Articles

tags

型定義ファイルの作成

共通

microCMSのAPIのリクエストとレスポンスで使用する共通の型を作成します。

src/types/api.ts

export type ContentsResponse<T> = {
 contents: T[];
 totalCount: number;
 offset: number;
 limit: number;
};
 
export type ContentResponse<T> = {
 id: string;
 createdAt: string;
 updatedAt: string;
 publishedAt: string;
 revisedAt: string;
} & T;
 
export type ContentsQuery = {
 draftKey?: string;
 offset?: number;
 limit?: number;
 orders?: string;
 q?: string;
 fields?: string;
 ids?: string;
 filters?: string;
 depth?: number;
};
 
export type ContentQuery = {
 draftKey?: string;
 fields?: string;
 depth?: number;
};


Articles

記事用のレスポンスの型を作成します。

src/types/article.ts

import { ContentsResponse } from "./api";
import { TagResponse } from "./tag";
import { ImageResponse } from "./image";
 
export type ArticlesResponse = ContentsResponse<ArticleResponse>;
 
export type ArticleResponse = ContentResponse<{
 title?: string;
 body?: string;
 tags?: TagResponse[];
 image?: ImageResponse;
}>;


タグと画像用の型も作成します。

src/types/tag.ts

import { ContentResponse, ContentsResponse } from "./api";
import { ImageResponse } from "./image";
 
export type TagsResponse = ContentsResponse<TagResponse>;
 
export type TagResponse = ContentResponse<{
 name?: string;
 image?: ImageResponse;
}>;

src/types/image.ts
export type ImageResponse = {
 url?: string;
 height?: number;
 width?: number;
};


aspidaの設定

プロジェクトルートに aspida.config.js を作成します。

aspida.config.js

module.exports = {
 input: "src/apis",
};


aspida用の型定義ファイルを作成します。

src/apis/articles/index.ts

import { ContentsQuery } from "src/types/api";
import { ArticlesResponse } from "src/types/article";
 
export type Methods = {
 get: {
  query?: ContentsQuery;
  resBody: ArticlesResponse;
 };
};


src/apis/articles/_id@string/index.ts

import { ContentQuery } from "src/types/api";
import { ArticleResponse } from "src/types/article";
 
export type Methods = {
 get: {
  query?: ContentQuery;
  resBody: ArticleResponse;
 };
};


$api.tsを生成

package.json の scripts に "api:build": "aspida" を追加します。

package.json

"scripts": {
  "dev": "next dev",
  "build": "next build",
  "start": "next start",
  "api:build": "aspida"
 }


yarn api:build

上記を実行すると、src/apis/$api.ts が生成されます。

APIを叩く

APIを叩く為の共通設定を utils/api.ts に持たせます。

utils/api.ts

import aspida from '@aspida/fetch'
import api from 'src/apis/$api'
 
const fetchConfig: Required<Parameters<typeof aspida>>[1] = {
 baseURL: 'https://[YOUR-SERVICE].microcms.io/api/v1/',
 throwHttpErrors: true,
 headers: {
  "X-API-KEY": '[YOUR-API-KEY]',
 },
};
 
export const client = api(aspida(fetch, fetchConfig));


シンプルにAPIを呼べるようになりました!

import { ArticlesResponse } from 'src/types/article'
import { client } from 'src/utils/api'
 
const response = await client.articles.$get()


0件目から、5件取得する場合

const response = await client.articles.$get({
 query: {
  offset: 0,
  limit: 5,
 },
})


IDから1件取得する場合

const id = 'content-id';
const response = await client.articles._id(id).$get()