国会図書館APIを使用する
この記事は2023/12/8に公開しましたが、2024年1月のAPIリニューアルに伴い改めて書き直しました。
概要
国立国会図書館が提供しているAPIを利用して書誌情報を取得する方法。2024年の1月にリニューアルされた。
以前は返り値もかなり少なかった書影APIも、JPROの提供により大幅に強化されている。
参考(いずれも国立国会図書館・国立国会図書館サーチのWebサイトより)
情報を取得する
以下のAPIを使用して取得する(以下jsで取得)
- 検索用API(SRUを使用)
- 書影API
<div id="cover"></div><ul> <li>タイトル:<span id="title"></span></li> <li>ISBN:<span id="isbn"></span></li> <li>著者:<span id="author"></span></li> <li>出版社:<span id="publisher"></span></li></ul>
APIはXML形式で値が返ってくる。書影APIも画像がない場合の返却値はXML形式。
document.addEventListener('DOMContentLoaded', () => {
/* 書籍情報取得(XML形式) */ const title = document.getElementById('title'); const isbn = document.getElementById('isbn'); const author = document.getElementById('author'); const publisher = document.getElementById('publisher');
const isbncode = '9784003101117'; //ISBNコード const api_url = `https://ndlsearch.ndl.go.jp/api/sru?operation=searchRetrieve&recordPacking=xml&maximumRecords=1&query=isbn=${isbncode}`; //console.log(api_url);
async function xmlLoad() { const res = await fetch(api_url); const text = await res.text(); const xml = new DOMParser().parseFromString(text, 'application/xml'); //console.log(xml); title.textContent = xml.getElementsByTagName('dc:title')[0].textContent; isbn.textContent = isbncode; author.textContent = xml.getElementsByTagName('dc:creator')[0].textContent; publisher.textContent = xml.getElementsByTagName('dc:publisher')[0].textContent; } xmlLoad();
/* カバー画像取得 */ const cover = document.getElementById('cover'); const cover_api = `https://ndlsearch.ndl.go.jp/thumbnail/${isbncode}.jpg`; //画像の有無で表示出し分け const checkIfImage = (cover_url) => { return new Promise((resolve, reject) => { const img = new Image(); img.src = cover_url; img.onload = () => resolve(cover_url); img.onerror = () => reject(cover_url); }); }; checkIfImage(cover_api) .then((cover_api) => { cover.innerHTML = `<img src="${cover_api}" alt="カバー画像" width="190" height="280">`; }) .catch((cover_api) => { cover.textContent = '画像なし'; });
});
書影APIで取得するカバー画像をasync/await
で取得しようとするとCORSエラーとなってしまうため、Promise
を利用して取得している。
このエラーになるならないの違いがよくわからない…。