技术博客
行政区划查询子区域查询实战:用 parentId 逐级下钻省→市→区→街道

行政区划查询子区域查询实战:用 parentId 逐级下钻省→市→区→街道

作者: 万维易源
2026-08-31
行政区划查询子区域查询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)