今日油价返回字段全解:p89/p90/p0/p92/p93/p95/p97/p98 与 ct 一文读懂
# 今日油价返回字段全解:p89/p90/p0/p92/p93/p95/p97/p98 与 ct 一文读懂
> 接口/接入点:今日油价 · 查询油价(138-46) · 免费 · POST/GET · JSON · 适用人群:初级/中级开发者 · 阅读时间:约 6 分钟
## TL;DR
- 查询油价返回 `showapi_res_body.list[]`,每一项是一省油价,含 `prov` 和 8 个标号字段 + 更新时间 `ct`。
- 标号分两类:**汽油**(p89/p90/p92/p93/p95/p97/p98)与 **0 号柴油(p0)**;不存在 p91/p94/p96。
- 空字符串(如 `p90/p93/p97` 为 `""`)代表该省未公布此标号,不是接口报错。
## Why
调参和渲染前,先把每个字段搞明白,能少踩很多坑:比如把 `p0` 当成「价格 0」、把空字符串当成「接口挂了」、把字符串价格直接拿去做加减。这篇把返回结构和标号含义一次性讲清。
## What
| 项 | 说明 |
|----|------|
| 接入点 | 查询油价(138-46) |
| 返回结构 | `showapi_res_body` → `list[]` → 单省对象 |
| 计费 | 免费 |
| 更新频率 | 每日 7 点 |
`list` 单省对象字段:
| 字段 | 类型 | 含义 |
|------|------|------|
| `prov` | String | 省份名,如「北京」 |
| `p89` | String | 89 号汽油 |
| `p90` | String | 90 号汽油(历史标号) |
| `p0` | String | **0 号柴油** |
| `p92` | String | 92 号汽油(现行主流) |
| `p93` | String | 93 号汽油(历史标号) |
| `p95` | String | 95 号汽油(现行主流) |
| `p97` | String | 97 号汽油(历史标号) |
| `p98` | String | 98 号汽油 |
| `ct` | String | 数据更新时间,如 `2022-09-07 10:06:12.867` |
## How
解析返回时,把 `list[0]` 的字段映射到前端展示。下面以 Python 展示「汽油标号 → 价格」的映射,跳过空值:
```python
import requests
resp = requests.post(
"https://route.showapi.com/138-46",
data={"appKey": "YOUR_APPKEY", "prov": "北京"},
timeout=10,
).json()
item = resp["showapi_res_body"]["list"][0]
gas_labels = {
"p89": "89号", "p90": "90号", "p92": "92号",
"p93": "93号", "p95": "95号", "p97": "97号", "p98": "98号",
}
for code, label in gas_labels.items():
price = item.get(code)
if price: # 跳过空字符串
print(f"{label}汽油: {price} 元/升")
print(f"0号柴油: {item['p0']} 元/升")
print(f"更新时间: {item['ct']}")
```
cURL:
```bash
curl -X POST "https://route.showapi.com/138-46?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded" \
-d "prov=%E5%8C%97%E4%BA%AC"
```
Node.js(fetch):
```javascript
const resp = await fetch("https://route.showapi.com/138-46", {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ appKey: "YOUR_APPKEY", prov: "北京" }),
});
const item = (await resp.json()).showapi_res_body.list[0];
const gas = { p89: "89号", p90: "90号", p92: "92号", p93: "93号", p95: "95号", p97: "97号", p98: "98号" };
for (const [k, v] of Object.entries(gas)) {
if (item[k]) console.log(`${v}汽油: ${item[k]}`);
}
console.log(`0号柴油: ${item.p0}`);
```
## 返回示例与解析
参考返回(节选):
```json
{
"showapi_res_body": {
"ret_code": 0,
"list": [
{
"prov": "北京",
"p90": "",
"p0": "8.16",
"p95": "8.97",
"p97": "",
"p98": "9.95",
"p89": "7.88",
"p92": "8.42",
"p93": "",
"ct": "2022-09-07 10:06:12.867"
}
]
}
}
```
注意 `p90/p93/p97` 为空字符串——某些省份对历史标号(90/93/97)可能不公布,前端应把空值显示为「—」而非报错。
## 进阶/边界
- **标号分类**:现行国六标号是 89/92/95/98(汽油)+ 0 号(柴油);90/93/97 是旧标准的历史标号,接口同时返回便于兼容老系统。详见[《今日油价:89/92/95/98 与 90/93/97 有什么区别?标号含义科普》](https://www.showapi.com/guides/oilprice-grade-meaning-138)。
- **`p0` 是柴油不是「0 元」**:别把 `p0` 当成缺省值。
- **价格为字符串**:所有 `p*` 均为字符串,计算前 `parseFloat`。
## FAQ
**Q:为什么有的标号是空字符串?**
A:代表该省未公布此标号价格(常见于历史标号 90/93/97),并非接口异常。
**Q:p0 是什么油?**
A:0 号柴油,是柴油不是「价格 0」。
**Q:价格为什么是字符串?**
A:接口所有 `p*` 字段都是字符串类型,前端做计算需先转数字。
**Q:有没有 p91/p94/p96?**
A:文档返回结构中不存在这三个字段,只有 p89/p90/p92/p93/p95/p97/p98 与 p0。
## 相关能力 / 下一步阅读
- [今日油价:5 分钟接入,从注册到查到北京 92 号汽油价格](https://www.showapi.com/guides/oilprice-quickstart-138)
- [今日油价:89/92/95/98 与 90/93/97 有什么区别?标号含义科普](https://www.showapi.com/guides/oilprice-grade-meaning-138)
- **本系列共 13 篇**:查看[今日油价开发指南总目录](https://www.showapi.com/guides/oilprice-guides-138)