条码生成图片 12 小时过期:缓存与本地落盘保存策略
# 条码生成图片 12 小时过期:缓存与本地落盘保存策略
> 接口/接入点:条码生成与识别(apiCode 1129)· 1129-1 生成 | 是否免费:免费 | 请求方式:POST/GET | 返回格式:JSON | 适用人群:开发者、架构师 | 阅读时间:约 6 分钟
## TL;DR
- 生成接口返回的 `imgUrl` **每 12 小时删除数据**,不是永久地址。
- 生产环境必须在生成后**立即下载落盘**到自有存储(本地/对象存储/CDN)。
- 已落盘后可做缓存复用,避免重复生成;原 `imgUrl` 仅作"临时取图通道"。
## Why:为什么必须关心过期
很多开发者第一次用会直接把 `imgUrl` 写进数据库、印进价签、嵌进网页长期展示。12 小时后链接失效,页面变成裂图、价签扫不出——这是本接口最高频的"坑"。本篇给你可落地的保存方案。
## What:时效事实
| 项 | 说明 |
|----|------|
| 过期对象 | 仅生成接口(1129-1)返回的图片链接 `imgUrl` |
| 时效 | 每 12 个小时删除数据(文档原文) |
| 识别接口(1129-2/3/4) | 即时返回 `retText`,不存储图片,无此过期问题 |
> 注意:过期的是"图",不是"数据"——你存入自己系统的 SKU 与对应落盘图片才是长期资产。
## How:生成即落盘(Python)
```python
import requests, hashlib, os
APPKEY = "YOUR_APPKEY"
STORE = "barcodes"
os.makedirs(STORE, exist_ok=True)
def gen_and_save(content: str, fmt: str = "5") -> str | None:
r = requests.post(
f"https://route.showapi.com/1129-1?appKey={APPKEY}",
data={"content": content, "formatType": fmt}, timeout=10,
).json().get("showapi_res_body", {})
if r.get("ret_code") != "0" or not r.get("imgUrl"):
return None
# 立即下载落盘,文件名用内容哈希避免重复
name = hashlib.md5(content.encode()).hexdigest() + ".jpg"
img = requests.get(r["imgUrl"], timeout=10).content
path = os.path.join(STORE, name)
with open(path, "wb") as f:
f.write(img)
return path # 返回本地/对象存储路径,长期可用
saved = gen_and_save("6901294172197")
print("本地路径(可长期用):", saved)
```
cURL(仅取图,落盘需配合下载):
```bash
curl -X POST "https://route.showapi.com/1129-1?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "content=6901294172197&formatType=5"
```
Node.js(生成 + 下载):
```javascript
const APPKEY = "YOUR_APPKEY";
const r = await fetch(`https://route.showapi.com/1129-1?appKey=${APPKEY}`, {
method: "POST", headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ content: "6901294172197", formatType: "5" })
});
const { imgUrl } = (await r.json()).showapi_res_body;
const img = await (await fetch(imgUrl)).arrayBuffer();
// 写入对象存储/CDN,保存返回的持久 URL
```
## 返回示例与解析
```json
{ "showapi_res_body": { "imgUrl": "http://app2.showapi.com/img/barCodeImg/20160930/xxxx.jpg", "ret_code": "0" } }
```
拿到 `imgUrl` 后第一时间 GET 下载,不要等到展示时再拉。
## 进阶 / 边界
- **缓存复用**:同一 `content`+`formatType` 生成的图内容稳定,可用 `content` 哈希做 key 缓存,命中则直接返回已落盘地址,省调用。
- **对象存储转发**:下载后上传到 OSS/COS/S3 并走 CDN,得到永久可访问地址;原 `imgUrl` 仅作临时通道。
- **不要依赖原链接做长期字段**:数据库里存"本地/对象存储路径",而非 `imgUrl`。
## FAQ
**Q:过期后还能用原 imgUrl 吗?**
不能。每 12 小时删除数据,过期链接返回图片已不存在;务必用落盘后的自有地址。
**Q:识别接口返回的文字会过期吗?**
不会。1129-2/3/4 即时返回 `retText`,不存储图片,无 12h 过期问题。
**Q:同一内容重复生成会出一样的图吗?**
图像内容由 `content`+`formatType`+尺寸决定,理论一致;但 `imgUrl` 路径会变且都会过期,故以落盘文件为准、可做哈希缓存。
**Q:落盘后还需要接口吗?**
展示/打印用落盘图即可;仅当需要"按内容重新出图"(如换格式/尺寸)时再调用生成接口。
## 相关能力 / 下一步阅读
- [零售与仓储如何用条码生成接口做商品条码与价签](https://www.showapi.com/guides/barcode-generate-retail-1129)
- [条码生成与识别:返回字段全解(imgUrl / retText / ret_code / msg)](https://www.showapi.com/guides/barcode-response-fields-1129)
- [条码生成与识别:13 种条码格式(formatType)对照与选型指南](https://www.showapi.com/guides/barcode-format-types-1129)
- **本系列共 12 篇**:查看[条码生成与识别指南总目录](https://www.showapi.com/guides/barcode-guides-1129)