HTTP API 指南

查询接口、响应格式、兼容模式、状态码与业务系统接入建议。

客户端 HTTP API 指南

本文描述 HCIP 客户端运行时对外提供的 HTTP API 接口契约,适用于私有化部署后的业务系统集成。

1. 基础信息

默认服务地址由 config.yaml 中的 server.listen 决定。示例:

server:
  listen: "0.0.0.0:8080"

本指南中的示例以以下地址为准:

http://127.0.0.1:8080

所有接口当前均为 GET 方法。除 /health/version/license 外,查询接口会根据对应产品 license 状态决定是否可用。

2. 访问控制

HCIP 客户端 HTTP API 不内置 API Key、Token、签名或账号鉴权。私有化部署时应由部署环境控制访问边界:

  • 仅监听内网地址或本机地址。
  • 使用防火墙或安全组限制访问来源。
  • 通过 Nginx、API Gateway、Ingress 等反向代理增加鉴权。
  • 对外暴露时启用 HTTPS,必要时使用 mTLS。

3. 响应格式

3.1 默认 JSON 响应

默认配置:

response:
  format: "json"
  style: "snake"

成功响应基本结构:

{
  "code": 200,
  "message": "处理成功",
  "data": {},
  "request_id": "e14de18265c544fcaed2d1243d5f037c"
}

错误响应基本结构:

{
  "code": 400,
  "message": "IP地址格式错误",
  "data": null,
  "request_id": "64c55c1039454f7eba2fa885a28ca837"
}

response.style 控制字段命名:

  • snake:返回 request_idlong_ipregion_idcity_id 等字段。
  • camel:返回 requestIdlongIpregionIdcityId 等字段。

3.2 旧客户端兼容响应

请求头 X-HCIP-Response-Version 优先级最高,会覆盖 response.formatresponse.style

curl -H 'X-HCIP-Response-Version: v1' \
  'http://127.0.0.1:8080/ip?ip=113.116.36.105'

支持值:

  • v1:返回 retmsgdatalog_id
  • v2:返回 codemessagedatarequest_id

兼容响应使用旧业务码,例如 400014000240003

4. 公共状态码

HTTP 状态码 典型含义
200 请求成功
400 参数缺失、参数格式错误或数据未找到
403 对应产品 license 不可用、过期或未授权
405 请求方法不支持
503 对应产品数据库未加载
500 服务端解析数据失败

默认 JSON 响应中的 code 通常与 HTTP 状态码一致。旧兼容模式下业务码可能为 400014000240003

5. GET /health

健康检查接口。只要至少一个已启用产品 license 有效,接口返回 HTTP 200;否则返回 HTTP 403。

请求

curl 'http://127.0.0.1:8080/health'

成功响应

{
  "ok": true,
  "status": "running",
  "products": {
    "hcip": {
      "status": "valid",
      "valid": true,
      "message": "license valid"
    },
    "mobile": {
      "status": "valid",
      "valid": true,
      "message": "license valid"
    }
  }
}

失败响应

{
  "ok": false,
  "status": "license_invalid",
  "products": {
    "hcip": {
      "status": "expired",
      "valid": false,
      "message": "license expired"
    },
    "mobile": {
      "status": "disabled",
      "valid": false,
      "message": "手机号归属地授权未找到,手机号查询服务启动失败,已跳过"
    }
  }
}

产品状态

状态 含义
valid license 有效,产品可用
expired license 已过期
invalid license 无效
load_failed license 加载失败
disabled 产品未启用或被跳过

6. GET /version

返回程序版本和当前加载的 DBX 信息。

请求

curl 'http://127.0.0.1:8080/version'

响应

{
  "name": "hcip",
  "version": "0.1.0",
  "products": {
    "hcip": {
      "db_path": "/opt/hcip/ip.dbx",
      "db_source_name": "hcip-20260601.db",
      "db_source_sha256": "..."
    },
    "mobile": {
      "db_path": "/opt/hcip/mobile.dbx",
      "db_source_name": "mobile-20260601.db",
      "db_source_sha256": "..."
    }
  },
  "db_loaded_at": "2026-06-09T08:00:00Z"
}

字段说明:

字段 说明
name 服务名称,固定为 hcip
version 程序版本,构建时注入
products.*.db_path 当前产品 DBX 文件路径
products.*.db_source_name DBX header 中记录的源数据名称
products.*.db_source_sha256 DBX header 中记录的源数据 SHA-256
db_loaded_at 当前内存数据库加载时间

7. GET /license

返回两个产品的 license 状态。

请求

curl 'http://127.0.0.1:8080/license'

响应

{
  "products": {
    "hcip": {
      "valid": true,
      "subject": "customer-a",
      "not_before": "2026-01-01T00:00:00Z",
      "not_after": "2027-01-01T00:00:00Z",
      "days_left": 205,
      "license_status": "valid",
      "message": "license valid"
    },
    "mobile": {
      "valid": false,
      "days_left": 0,
      "license_status": "disabled",
      "message": "手机号归属地授权未找到,手机号查询服务启动失败,已跳过"
    }
  }
}

字段说明:

字段 说明
valid 当前是否可用
subject license 主体,通常对应客户标识
not_before license 生效时间
not_after license 过期时间
days_left 剩余天数,过期后为 0
license_status 当前状态
message 状态说明
error 加载失败时的错误信息

8. GET /ip

IP 归属地查询接口。

请求

curl 'http://127.0.0.1:8080/ip?ip=113.116.36.105'

Query 参数

参数 必填 说明
ip IPv4 或 IPv6 地址。特殊值 localhost 会按请求来源解析为请求发起者 IP 地址。

成功响应

默认 snake 风格:

{
  "code": 200,
  "message": "处理成功",
  "data": {
    "ip": "113.116.242.237",
    "long_ip": "1903489773",
    "isp": "中国电信",
    "area": "华南",
    "region_id": "440000",
    "region": "广东",
    "city_id": "440300",
    "city": "深圳",
    "district": "光明区",
    "district_id": "440311",
    "country_id": "CN",
    "country": "中国",
    "lat": "22.748750",
    "lng": "113.936059"
  },
  "request_id": "e14de18265c544fcaed2d1243d5f037c"
}

camel 风格会将部分字段改为 longIpregionIdcityIddistrictIdcountryIdrequestId

字段说明

字段 说明
ip 查询 IP
long_ip IPv4 长整型字符串;IPv6 场景可能按数据源返回
isp 运营商
area 大区
region_id 省级行政区划代码
region 省份/地区
city_id 城市行政区划代码
city 城市
district 区县
district_id 区县行政区划代码
country_id 国家/地区代码
country 国家/地区名称
lat 纬度
lng 经度

错误响应

缺少 IP:

{
  "code": 400,
  "message": "IP地址参数不能为空",
  "data": null,
  "request_id": "64c55c1039454f7eba2fa885a28ca837"
}

IP 格式错误:

{
  "code": 400,
  "message": "IP地址格式错误",
  "data": null,
  "request_id": "64c55c1039454f7eba2fa885a28ca837"
}

IP 未找到:

{
  "code": 400,
  "message": "IP地址未找到",
  "data": null,
  "request_id": "64c55c1039454f7eba2fa885a28ca837"
}

license 不可用:

{
  "code": 403,
  "message": "license expired",
  "data": null,
  "request_id": "64c55c1039454f7eba2fa885a28ca837"
}

9. GET /query

/query/ip 的别名,参数、响应、错误码与 /ip 一致。

请求

curl 'http://127.0.0.1:8080/query?ip=113.116.36.105'

建议新接入系统优先使用 /ip,仅在兼容旧调用方时保留 /query

10. GET /mobile

手机号归属地查询接口。

请求

curl 'http://127.0.0.1:8080/mobile?mobile=18138434699'

Query 参数

参数 必填 说明
mobile 中国大陆手机号。

成功响应

默认 snake 风格:

{
  "code": 200,
  "message": "处理成功",
  "data": {
    "types": "中国电信",
    "city": "深圳",
    "zip_code": "518000",
    "isp": "中国电信",
    "prov": "广东",
    "num": "1813843",
    "city_code": "0755",
    "lat": "22.543099",
    "area_code": "440300",
    "lng": "114.057868"
  },
  "request_id": "02e083adc869472fbd1b7f322e0e4489"
}

camel 风格会将 zip_codecity_codearea_coderequest_id 改为 zipCodecityCodeareaCoderequestId

字段说明

字段 说明
types 号段类型或运营商类型
city 城市
zip_code 邮政编码
isp 运营商名称
prov 省份
num 号段
city_code 电话区号
lat 纬度
area_code 行政区划代码
lng 经度

错误响应

缺少手机号:

{
  "code": 400,
  "message": "手机号参数不能为空",
  "data": null,
  "request_id": "02e083adc869472fbd1b7f322e0e4489"
}

手机号格式错误:

{
  "code": 400,
  "message": "手机号格式错误",
  "data": null,
  "request_id": "02e083adc869472fbd1b7f322e0e4489"
}

手机号未找到:

{
  "code": 400,
  "message": "手机号未找到",
  "data": null,
  "request_id": "02e083adc869472fbd1b7f322e0e4489"
}

mobile license 不可用:

{
  "code": 403,
  "message": "license expired",
  "data": null,
  "request_id": "02e083adc869472fbd1b7f322e0e4489"
}

11. 接口可用性与 license 状态

产品与接口对应关系:

产品 配置块 接口
hcip products.hcip /ip
mobile products.mobile /mobile

当某个产品 license 失效、过期、加载失败或权限不匹配时:

  • /health 会反映该产品状态。
  • /license 会返回该产品状态和错误说明。
  • 该产品对应查询接口返回 HTTP 403。
  • 其他产品如果 license 有效,仍可继续服务。

12. 调用建议

业务系统接入时建议:

  1. 启动后先调用 /health 做健康检查。
  2. 通过 /version 记录当前 DBX source,用于排查数据版本问题。
  3. 通过 /license 监控授权到期时间。
  4. 查询接口按 HTTP 状态码和响应体 code 同时判断结果。
  5. 如果需要兼容旧字段,优先通过配置 response.style 或请求头 X-HCIP-Response-Version 固定响应格式。
  6. 不要假设 request_id 可重复或有业务含义,它仅用于单次请求追踪。