基于ISBN调用Open Library API查询图书数字借阅可用性
问题:Open Library API 图书借阅可用性属性确认与代码修正
我已实现搜索栏功能,可通过Google Books API根据搜索词获取包含标题、作者、ISBN等信息的图书列表,该部分运行正常。现在需要为每个列表项添加按钮,点击后调用Open Library API,传入Google Books返回的ISBN,查询该图书是否可在Open Library进行数字借阅。我想明确Open Library API中对应图书借阅可用性的数据属性名称(例如Google Books中ISBN对应volumeInfo.industryIdentifiers[0].identifier),目前推测可能是editions.ebook_access但不确定,希望能正确引用该属性并在页面展示。
Google Books 数据提取代码
var bookTitle = book.volumeInfo.title; var bookAuthor = book.volumeInfo.authors; var bookDescription = book.volumeInfo.description var bookThumbnail = book.volumeInfo.imageLinks.smallThumbnail; var isbn = book.volumeInfo.industryIdentifiers[0].identifier;
我编写的Open Library API 请求代码
var fetchRequest = function() { var isbn = '0451526538' var searchURL = `https://openlibrary.org/api/books?bibkeys=${isbn}&format=json&jscmd=data`; fetch(searchURL) .then(function(response) { return response.json(); }) .then(function(response2) { return response2.items.map(function(book) { createBookList(book) }) }) .catch( function() { console.log(`There was an error with the fetch request`); }); }
我尝试的属性关联代码
bookEPUB.textContent = 'This book is available to borrow in ePUB format'; bookEPUB.href = 'book.ebooks.availability.epub_url'; bookPDF.textContent = 'This book is available to borrow in PDF format'; bookPDF.href = 'book.ebooks.availability.pdf_url'; bookTEXT.textContent = 'This book is available to borrow in TEXT format'; bookTEXT.href = 'book.ebooks.availability.text_url';
正确的Open Library API 借阅属性说明
你使用的https://openlibrary.org/api/books接口,当指定jscmd=data参数时,电子书借阅相关属性位于ebooks字段下:
- 借阅权限标识:
ebooks.access,常见值为borrow(可借阅)、read(免费阅读) - 格式链接属性:
- ePUB借阅链接:
ebooks.availability.epub_url - PDF借阅链接:
ebooks.availability.pdf_url - TEXT借阅链接:
ebooks.availability.text_url
- ePUB借阅链接:
另外,你的请求代码存在两处关键错误,需要修正:
- Bibkeys格式错误:接口要求ISBN参数必须添加前缀(如
ISBN:),否则无法正确匹配图书 - 响应结构处理错误:该接口返回的是键为
ISBN:xxx的对象,而非包含items数组的结构,不能用response2.items.map遍历
修正后的请求代码
var fetchRequest = function(isbn) { // 为ISBN添加前缀,兼容ISBN-10/ISBN-13格式 var bibkey = `ISBN:${isbn}`; var searchURL = `https://openlibrary.org/api/books?bibkeys=${bibkey}&format=json&jscmd=data`; fetch(searchURL) .then(function(response) { return response.json(); }) .then(function(responseData) { // 提取返回的图书数据(取对象的第一个值) var bookData = Object.values(responseData)[0]; if (bookData) { displayBorrowInfo(bookData); } else { console.log('未找到该图书的借阅信息'); } }) .catch( function() { console.log(`请求Open Library API时出错`); }); }
修正后的属性关联代码
function displayBorrowInfo(book) { // 检查是否有可借阅的电子书资源 if (book.ebooks && book.ebooks.access === 'borrow') { // 处理ePUB格式 if (book.ebooks.availability.epub_url) { bookEPUB.textContent = '可借阅ePUB格式'; bookEPUB.href = book.ebooks.availability.epub_url; bookEPUB.style.display = 'inline'; } else { bookEPUB.style.display = 'none'; } // 处理PDF格式 if (book.ebooks.availability.pdf_url) { bookPDF.textContent = '可借阅PDF格式'; bookPDF.href = book.ebooks.availability.pdf_url; bookPDF.style.display = 'inline'; } else { bookPDF.style.display = 'none'; } // 处理TEXT格式 if (book.ebooks.availability.text_url) { bookTEXT.textContent = '可借阅TEXT格式'; bookTEXT.href = book.ebooks.availability.text_url; bookTEXT.style.display = 'inline'; } else { bookTEXT.style.display = 'none'; } } else { // 无可用借阅资源时的提示 bookEPUB.textContent = '该图书无法在Open Library数字借阅'; bookEPUB.href = ''; bookEPUB.style.display = 'inline'; bookPDF.style.display = 'none'; bookTEXT.style.display = 'none'; } }
内容的提问来源于stack exchange,提问作者TD99999
相关产品推荐
相关产品推荐

