行政区划查询子区域查询实战:用 parentId 逐级下钻省→市→区→街道
# 行政区划查询子区域查询实战:用 parentId 逐级下钻省→市→区→街道
> 接口 / 接入点:行政区划查询(apiCode 1149)· 子区域查询 1149-2 · 免费服务
> 请求方式:POST / GET · 返回格式:JSON · 适用人群:全栈工程师、做级联选择的开发者 · 阅读时间:约 7 分钟
## 核心要点
- 子区域查询(1149-2)只有一个必填参数:`parentId`(上级区域 id)。
- `parentId` 来自区域查询(1149-1)返回的 `id`,两级接入点由此联动。
- 用「查父级 → 取 id → 作为 parentId 再查」的循环,即可无限级下钻到村委会。
## Why:为什么需要子区域查询
区域查询(1149-1)靠名称 + level 检索,适合「我知道名字,想拿到它的编码」。但做「选了省之后自动列出市、选了市自动列出区」的级联时,你手里只有上一级的 id,没有下一级的名字——这时就该用子区域查询(1149-2),它专门按 `parentId` 返回下一级列表。
## What:两个接入点怎么配合
| 接入点 | 必填参数 | 作用 |
|--------|---------|------|
| 1149-1 区域查询 | `areaName` | 按名称 + level 拿到区域及其 `id` |
| 1149-2 子区域查询 | `parentId` | 按上级 `id` 列出其下级区域 |
接口地址:
- 区域查询:`https://route.showapi.com/1149-1?appKey=YOUR_APPKEY`
- 子区域查询:`https://route.showapi.com/1149-2?appKey=YOUR_APPKEY`
## How:逐级下钻代码
下面演示「查广东省(拿 id)→ 用其 id 查下属城市」:
### Python
```python
import requests
APPKEY = "YOUR_APPKEY"
def region_query(area_name, level="1"):
r = requests.get("https://route.showapi.com/1149-1",
params={"appKey": APPKEY, "areaName": area_name, "level": level},
timeout=10)
body = r.json()["showapi_res_body"]
return body["data"]
def sub_region(parent_id, page="1"):
r = requests.get("https://route.showapi.com/1149-2",
params={"appKey": APPKEY, "parentId": parent_id, "page": page},
timeout=10)
body = r.json()["showapi_res_body"]
return body["data"]
# 第 1 步:查「广东省」拿 id
guangdong = region_query("广东省", "1")[0]
print("广东省 id:", guangdong["id"], guangdong["wholeName"])
# 第 2 步:用广东省 id 查下属城市
cities = sub_region(guangdong["id"])
for c in cities:
print(" -", c["areaName"], c["id"])
```
### cURL(子区域查询)
```bash
curl -X POST "https://route.showapi.com/1149-2?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "parentId=440000000000&page=1"
```
### Node.js(fetch)
```javascript
const APPKEY = "YOUR_APPKEY";
fetch(`https://route.showapi.com/1149-2?appKey=${APPKEY}&parentId=440000000000&page=1`)
.then(r => r.json())
.then(data => {
const body = data.showapi_res_body;
body.data.forEach(c => console.log(" -", c.areaName, c.id));
})
.catch(e => console.error("请求失败:", e));
```
## 返回示例(子区域查询 1149-2)
```json
{
"showapi_res_body": {
"ret_code": "0",
"data": [
{"areaName": "广州市", "id": "440100000000", "parentId": "440000000000", "level": "2", "cityId": "440100000000", "countyId": ""},
{"areaName": "深圳市", "id": "440300000000", "parentId": "440000000000", "level": "2", "cityId": "440300000000", "countyId": ""}
],
"page": "1",
"allNum": "21",
"maxSize": "20",
"allPage": "2"
}
}
```
注意 `allNum=21`、`allPage=2`、`maxSize=20`:下级超过 20 条时会分页,循环下钻别忘翻页(`page` 递增到 `allPage`)。
## 进阶 / 边界
- `parentId` 必填,取值必须来自区域查询返回的 `id`;传错来源会查不到数据。
- 区域查询(1149-1)本身也能设 `level=4/5` 直接查乡镇 / 村委会,并非只能靠子区域查询下钻——两条路都通,按你手头有什么选。
- 子区域查询返回的 `level` 仅为 1~3(省/市/区县),乡镇 / 村委会级建议回到区域查询 + `level`。
## FAQ
**Q:parentId 从哪里来?**
来自区域查询(1149-1)返回的 `id` 字段,二者是同一套编码。
**Q:下级超过 20 条怎么办?**
`maxSize` 每页最大 20 条,用 `page` 参数翻页直到 `allPage`,循环拉全。
**Q:子区域查询能直接查村委会吗?**
子区域查询返回的 `level` 只到 1~3;乡镇 / 村委会级请用区域查询(1149-1)设 `level=4/5`。
**Q:parentId 传了但 data 为空?**
检查 `parentId` 是否确实取自区域查询的 `id`,以及该区域是否确有下级(如村委会通常没有更下级)。
## 相关能力 / 下一步阅读
- [行政区划查询:5 分钟接入,从注册到第一条区划数据](https://www.showapi.com/guides/region-query-quickstart-1149)
- [行政区划查询 level 参数怎么选?省级到村委会 5 级行政层级对照](https://www.showapi.com/guides/region-query-level-guide-1149)
- [行政区划查询实战:省市区三级联动选择器前端实现](https://www.showapi.com/guides/region-query-cascade-1149)
- **本系列共 11 篇**:查看[行政区划查询指南总目录](https://www.showapi.com/guides/region-query-guides-1149)