图书ISBN查询封面图怎么用:img 字段下载、缓存与展示
# 图书ISBN查询封面图怎么用:img 字段下载、缓存与展示
> 接口/接入点:图书ISBN查询(1626-1) · 是否免费:免费 · 请求方式:POST / GET · 返回格式:JSON · 适用人群:前端/全栈开发者 · 阅读时间:约 5 分钟
## TL;DR
- 返回 `data.img` 是封面图**下载链接**(如 `http://static1.showapi.com/app2/isbn/imgs/...jpg`),可能为空。
- 两种用法:前端直链展示(简单)或后端下载到自己存储再返回(稳定、可控)。
- 封面可能为空,前端务必准备默认占位图兜底。
## Why
有了书名作者,再配一张封面图,图书卡片才完整好看。但封面是外链、可能为空、也可能将来变化。本文讲清两种接入方式,帮你既快又稳地把封面用起来。
## What
| 项 | 说明 |
|----|------|
| 字段 | `data.img`(String) |
| 形态 | 封面图下载链接,可能为空字符串 |
| 归属 | 图片存于 ShowAPI 静态资源域,建议下载自用而非长期硬依赖外链 |
## How
### 方式 A:前端直链展示(最简)
```html
<img src="${book.img}" alt="封面" width="120"
onerror="this.src='/assets/placeholder.png'" />
```
优点:零后端成本。缺点:依赖外链可用性,加载受对方 CDN 影响。
### 方式 B:后端下载落库(推荐用于生产)
```python
import requests, os, hashlib
IMG_DIR = "/var/www/covers"
os.makedirs(IMG_DIR, exist_ok=True)
def save_cover(isbn: str, img_url: str | None) -> str | None:
if not img_url:
return None
ext = ".jpg"
path = os.path.join(IMG_DIR, f"{isbn}{ext}")
if not os.path.exists(path):
r = requests.get(img_url, timeout=10)
r.raise_for_status()
with open(path, "wb") as f:
f.write(r.content)
return f"/covers/{isbn}{ext}"
```
落库后前端只访问你自己的 `/covers/{isbn}.jpg`,稳定可控。
## 返回示例与解析
```json
"img": "http://static1.showapi.com/app2/isbn/imgs/b7f2a56236d34a57a358a8878ea428c9.jpg"
```
`img` 为空时(如部分老书/无封面书),`save_cover` 返回 `None`,前端展示占位图。
## 进阶 / 边界
- **空值兜底**:`img` 可能为空,前端 `onerror` 或后端返回占位图路径。
- **防盗链**:外链直显若遇防盗链/跨域,改用方式 B 后端下载。
- **缓存一致**:封面与书目一起按 `isbn` 缓存,避免重复下载。
- **格式**:示例多为 `.jpg`,下载时按实际 Content-Type 存后缀更稳妥。
## FAQ
**Q1:img 链接会失效吗?**
作为外部资源链接,不建议长期硬依赖。生产环境推荐下载到自己存储。
**Q2:img 为空时怎么处理?**
返回 `None`/空,前端显示默认封面占位图即可,不影响其他字段展示。
**Q3:直链展示有跨域问题吗?**
`<img>` 标签一般不受同源限制,但遇防盗链或加载失败,用后端下载方式规避。
**Q4:需要把封面图和书目一起缓存吗?**
建议。以 `isbn` 为 key 缓存整条书目(含封面本地路径),减少重复请求与下载。
## 相关能力 / 下一步阅读
- [图书ISBN查询返回字段全解:一本书的 13 个元数据字段一文读懂](https://www.showapi.com/guides/isbn-book-fields-explained-1626)
- [图书管理系统如何集成图书ISBN查询:从扫码录入到藏书档案](https://www.showapi.com/guides/isbn-book-library-system-1626)
- [图书ISBN查询免费档位下如何设计缓存策略省调用额度](https://www.showapi.com/guides/isbn-book-cache-cost-1626)
- **本系列共 12 篇**:查看[图书ISBN查询(apiCode=1626)官方指南总目录](https://www.showapi.com/guides/isbn-book-guides-1626)