今回の記事では以下のようにHello Worldを返すだけのシンプルなAPIを作成してそのAPIドキュメントを生成していきます。
import { Hono } from 'hono'
const app = new Hono()
app.get('/hellp', (c) => {
return c.text('Hello, world!')
})
export default app通常であれば、Honoクラスからインスタンスを生成しますが、今回は@hono/zod-openapiを使用するためまずはこれらをインストールしましょう。
npm install @hono/zod-openapi
npm install @hono/swagger-uiそして、OpenAPIHonoクラスからインスタンスを生成します。OpenAPIHonoはOpenAPI ドキュメント生成に対応した拡張版のHonoクラスです。このクラスを使うことで app.openapi(...) や app.doc(...) などopenapiに対応した機能が使えるようになります。
import { Hono } from 'hono'
const app = new OpenAPIHono()
app.get('/hello', (c) => {
return c.text('Hello, world!')
})
export default appcreateRouteの定義
createRoute() は @hono/zod-openapi が提供する関数で、OpenAPI ドキュメントと Hono のルーティング定義を同時に行うためのものです。通常、API定義を書くときは次のように2つのことを別々に書きます:
- Honoでのルーティング定義
- OpenAPI(Swagger)のルーティング定義
createRoute()を使うことでこれらを1回の記述で対応できるようになります。さらにopenapi()を使用して、定義したルーティングをHonoで定義されたエンドポイントとハンドラに登録します。
import { OpenAPIHono, createRoute } from '@hono/zod-openapi'
import { z } from 'zod'
const app = new OpenAPIHono()
// OpenAPI 対応のルートを定義
app.openapi(
createRoute({
method: 'get',
path: '/hello',
description: 'シンプルな Hello World API',
tags: ['Sample'],
responses: {
200: {
description: '成功時のレスポンス',
content: {
'text/plain': {
schema: z.string(),
example: 'Hello, world!',
},
},
},
},
}),
async (c) => {
return c.text('Hello, world!')
}
)
export default appSwagger UIでドキュメントが見れるように設定する
app.openapi() で定義した API を Swagger UI で見られるようにするには、以下のようにコードを書きます。これによりapp.openapi(...) で登録したルーティングの情報を元に自動生成されるJSON 定義が /v1/spec/json に出力されます。そして、/v1/specのパスでSwagger UIが閲覧できるようになります。
app.get('/v1/spec', swaggerUI({ url: '/v1/spec/json' }))
app.doc('/v1/spec/json', {
openapi: '3.0.0',
info: {
title: 'My API',
version: '1.0.0',
description: 'シンプルなサンプルAPI',
},
})ローカルサーバーを立ててSwagger UIを確認する
今回作ったソースコードの全体が以下のようになります。
import { OpenAPIHono, createRoute } from '@hono/zod-openapi'
import { swaggerUI } from '@hono/swagger-ui'
import { z } from 'zod'
const app = new OpenAPIHono()
app.openapi(
createRoute({
method: 'get',
path: '/hello',
description: 'Hello World endpoint',
tags: ['Example'],
responses: {
200: {
description: '成功レスポンス',
content: {
'text/plain': {
schema: z.string(),
example: 'Hello, world!',
},
},
},
},
}),
(c) => c.text('Hello, world!')
)
// Swagger UI 設定
app.get('/v1/spec', swaggerUI({ url: '/v1/spec/json' }))
app.doc('/v1/spec/json', {
openapi: '3.0.0',
info: {
title: 'My API',
version: '1.0.0',
description: 'シンプルなサンプルAPI',
},
})
export default app別のファイルに@hono/node-server を使用して、Swagger UIを立ち上げるサーバーの記述を行います。
import { serve } from '@hono/node-server'
import app from './routes'
serve(app, (info) => {
console.log(`Swagger UI available at http://localhost:${info.port}/v1/spec`)
}) % npx ts-node server.ts
Swagger UI available at http://localhost:3000/v1/specそして、コマンドによりサーバーを立ち上げることでローカル上でAPI定義が確認できるようになりました。


