药品分类查询实战:用 classifyId 从大类层层下钻到具体药品
# 药品分类查询实战:用 classifyId 从大类层层下钻到具体药品
- **接口/接入点**:药品信息查询(apiCode=1468)· 1468-1 药品分类 + 1468-2 药品信息
- **是否免费**:免费(有档位限制)
- **请求方式**:POST / GET
- **返回格式**:JSON
- **适用人群**:全栈工程师、产品经理
- **阅读时间**:约 5 分钟
## 核心要点
- 药品分类(`class`→`classify`→`classifyId`)是后续查询的入口:用 `classifyId` 调 1468-2 即可拿到该分类下的药品列表。
- 1468-2 的 `classifyId` **必填**,不传或大分类下的「小分类」重复时容易取错,需结合大分类定位。
- `classify`(小分类)会跨大分类重复,建议用 `classifyId`(唯一)做业务主键。
## Why:为什么要用分类下钻
用户在前端选「感冒发热 → 头痛」,背后就是先取分类树、再按 `classifyId` 拉药品。这套「先分类、后列表」的链路是药品信息查询最典型的使用路径,也是健康管理、医药电商的标配交互。
## What:接口速览
| 接入点 | 必填 | 返回 |
|------|------|------|
| 1468-1 药品分类 | 无 | `data[]`:`class`/`classify`/`classifyId` |
| 1468-2 药品信息 | `classifyId` | `count`/`page`/`maxResult`/`data[]{drugId,drugName,manu,pzwh,classifyId}` |
## How:完整下钻代码
```python
import requests
APPKEY = "YOUR_APPKEY"
# 1) 取分类树,按大分类分组
r = requests.get(f"https://route.showapi.com/1468-1?appKey={APPKEY}", timeout=10)
cats = r.json()["showapi_res_body"]["data"]
# 2) 选一个 classifyId(示例取「头痛」对应的 Id)
target = next(c for c in cats if c["classify"] == "头痛")
print("选定:", target["class"], "/", target["classify"], target["classifyId"])
# 3) 用 classifyId 拉药品列表
r2 = requests.post(
"https://route.showapi.com/1468-2",
data={"appKey": APPKEY, "classifyId": target["classifyId"], "page": "1"},
timeout=10,
)
body = r2.json()["showapi_res_body"]
print("该分类药品总数:", body["count"])
for d in body["data"]:
print(d["drugName"], d["manu"])
```
```bash
# 第一步:拿分类
curl -X POST "https://route.showapi.com/1468-1?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded"
# 第二步:用分类 Id 拿药品
curl -X POST "https://route.showapi.com/1468-2?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "classifyId=599ad27f600b2149d689b5c4&page=1"
```
```javascript
const APPKEY = "YOUR_APPKEY";
const cats = await fetch(`https://route.showapi.com/1468-1?appKey=${APPKEY}`, { method: "POST" })
.then((r) => r.json()).then((j) => j.showapi_res_body.data);
const target = cats.find((c) => c.classify === "头痛");
const fd = new URLSearchParams({ classifyId: target.classifyId, page: "1" });
const list = await fetch(`https://route.showapi.com/1468-2?appKey=${APPKEY}`, { method: "POST", body: fd })
.then((r) => r.json()).then((j) => j.showapi_res_body.data);
console.log(list);
```
## 返回示例与解析
1468-2 返回含 `count`(该分类药品总数,示例 1000)、`maxResult`(单页条数,示例 50)。分页用 `page` 翻页。
## 进阶 / 边界
- **小分类重复**:「头痛」可能出现在多个大分类下,定位时必须用 `classifyId` 而非 `classify` 字符串。
- **一次只取一个分类**:1468-2 每次只接受单个 `classifyId`,要列出多个分类需循环调用(注意免费档位限制,见[缓存策略](https://www.showapi.com/guides/drug-info-cache-1468))。
- 拿到的 `drugId` 可喂给 1468-3 的 `searchType=4` 做精确详情检索。
## FAQ
**Q1:为什么用 classifyId 查不到药品?**
A:先确认 classifyId 来自 1468-1 的真实返回值,且 1468-2 必须 POST 带 `classifyId`;若仍为空,可能是该分类确实无药品或参数拼写有误。
**Q2:classify 重名怎么办?**
A:用 `classifyId`(全局唯一)做主键,不要依赖 `classify` 文本。`class`(大分类) 可作为展示分组。
**Q3:如何一次拿多个分类的药品?**
A:逐个 classifyId 循环调用 1468-2;免费档位下注意频控,建议先缓存分类树再分批同步。
## 相关能力 / 下一步阅读
- [药品信息查询:5 分钟快速接入指南](https://www.showapi.com/guides/drug-info-quickstart-1468)
- [classifyId 到底怎么用?药品分类 Id 的必填规则与排查](https://www.showapi.com/guides/drug-info-classifyid-1468)
- [免费档位限制下,如何设计缓存策略批量同步药品数据?](https://www.showapi.com/guides/drug-info-cache-1468)
- **本系列共 11 篇**:查看[药品信息查询指南总目录](https://www.showapi.com/guides/drug-info-guides-1468)