🚃

名松線の駅をランダムに返すAPI【Hono × Cloudflare Workers】

に公開

名松線は、三重県の松阪駅から津市の伊勢奥津駅までを結ぶJR東海のローカル線だ。全長43.5km。全線単線非電化。途中駅には無人駅も多く、日常的に利用する人が少ないこともあって、JR東海の路線の中では営業成績が最も悪いとされている。


名松線キハ11形

そんな名松線に、ほんの少しでも興味を持ってもらえたらいいなと思い、名松線の駅名をランダムで返すだけのシンプルなAPIを作ってみた。

使用技術は、TypeScript製の軽量フレームワーク「Hono」と「Cloudflare Workers」。これまでJavaScriptのAPIはNode.js(Express)で開発してきたが、HonoとCloudflare Workersを使ってみたところ、型安全で開発しやすく、デプロイも簡単で驚いた。Bunで動くため、高速かつ軽量なのも良い。日本の方が開発したという点でも応援したい。

リポジトリURL:https://github.com/muranakaaa/meisho-line-api
APIのURL:https://meisho-line-api.miesanpo.workers.dev/station

このエンドポイントにGETリクエストを送ると、名松線の駅名が1つランダムでJSON形式で返ってくる。

レスポンス例:

{
  "station": "伊勢川口駅",
  "city": "三重県津市"
}

実装コード(src/index.ts):

import { Hono } from 'hono'

const app = new Hono()

const stations = [
  { name: '松阪駅', city: '松阪市' },
  { name: '上ノ庄駅', city: '松阪市' },
  { name: '権現前駅', city: '松阪市' },
  { name: '伊勢八太駅', city: '津市' },
  { name: '一志駅', city: '津市' },
  { name: '井関駅', city: '津市' },
  { name: '伊勢大井駅', city: '津市' },
  { name: '伊勢川口駅', city: '津市' },
  { name: '関ノ宮駅', city: '津市' },
  { name: '家城駅', city: '津市' },
  { name: '伊勢竹原駅', city: '津市' },
  { name: '伊勢鎌倉駅', city: '津市' },
  { name: '伊勢八知駅', city: '津市' },
  { name: '比津駅', city: '津市' },
  { name: '伊勢奥津駅', city: '津市' }
]

app.get('/station', (c) => {
  const random = stations[Math.floor(Math.random() * stations.length)]
  const body = JSON.stringify(
    {
      station: random.name,
      city: `三重県${random.city}`
    },
    null,
    2
  )

  return new Response(body, {
    status: 200,
    headers: {
      'Content-Type': 'application/json; charset=utf-8'
    }
  })
})

export default app

Discussion