📄
Swagger UI の openapi.json を指定する URL 入力欄をプルダウンに変更する
Swagger UI とは
OpenAPI (Swagger) 仕様を見やすく表示してくれる UI です。
REST API Documentation Tool | Swagger UI
読み込む OpenAPI 仕様の JSON はページトップに表示される入力欄で指定できます。
やりたいこと
読み込む openapi.json が決まっている場合、手動で入力するのは手間なので URL をプルダウンから選べるようにします。
コード
swagger-initializer.js の url
を urls
に書き換えます。
swagger-initializer.js
window.ui = SwaggerUIBundle({
- url: "https://petstore.swagger.io/v2/swagger.json",
+ urls: [
+ {url: `${location.href}openapi.v2.json`, name: 'Twitter API v2'},
+ {url: `${location.href}openapi.labs.json`, name: 'Twitter API Labs'},
+ ],
古いバージョンで書き換える際の参考
フォームが JS から生成されるので生成された DOM を後から書き換えます。
詳細の差分はこちら。
元々の DOM
JS で生成される DOM。
index.html
<form class="download-url-wrapper">
<input type="text" class="download-url-input" value="./openapi.v2.json">
<button class="download-url-button button">Explore</button>
</form>
JavaScript
<body><script>
にある window.onload
の最後に追加します。
index.html
// プルダウンの値
const urls = [
`${location.href}openapi.v2.json`,
`${location.href}openapi.labs.json`,
]
// <select> を生成
const input = document.getElementsByClassName('download-url-input')[0]
const select = document.createElement('select')
select.classList = input.classList
urls.forEach (url => {
const option = document.createElement('option')
option.label = url
option.value = url
select.appendChild(option)
}
)
// プルダウンの選択が変更されたら読み込む
select.addEventListener('change', (event) => {
const url = event.target.value
ui.specActions.updateUrl(url)
ui.specActions.download(url)
});
// <select> を <input> と置き換える
input.parentElement.replaceChild(select, input)
// [Explore] ボタンを消す
document.getElementsByClassName('download-url-button')[0].remove()
デフォルト値も書き換えておきます。
index.html
const ui = SwaggerUIBundle({
url: `${location.href}openapi.v2.json`,
CSS
レイアウトの調整。 <head><style>
に定義。
index.html
.swagger-ui .topbar .download-url-wrapper select {
width: 100%;
margin: 0;
border: 2px solid #62a03f;
border-radius: 4px 0 0 4px;
outline: none;
min-width: 100px;
padding: 8px 10px;
box-sizing: border-box;
overflow: visible;
font-family: sans-serif;
font-size: 100%;
line-height: 1.15;
}
余談:ローカルでホスト
ローカルで動かそうとすると Fetch API が使えずエラーになります。
回避するための方法を以前書いたので興味のある方はどうぞ。
Discussion
Swagger UI 3.0.18 からは
urls
パラメータで似た挙動が実現できるようです。refs: https://stackoverflow.com/questions/44816594/swagger-ui-with-multiple-urls
公式機能にあったんですね、ありがとうございます。
記事に反映しました。