×

大麦网演出详情接口:字段归一化与增量缓存调取方案

Ace Ace 发表于2026-09-24 17:42:36 浏览12 评论0

抢沙发发表评论

前言

票务类详情接口和电商商品接口存在明显差异,演出数据存在多场次、多票价档位、状态动态变更的特点。普通直连方案容易出现场次字段错位、售罄状态更新延迟、重复请求消耗接口配额等问题。本文基于官方开放接口,设计一套带本地缓存、字段清洗、状态校验的封装方案,适合业务侧做演出信息同步、价格监控场景,避开网上单纯请求 Demo 的写法,聚焦生产环境数据稳定性。

前置准备

对接前需要在开放平台申请应用凭证,获取 appkey 与 secret。核心入参为演出项目 ID,接口返回数据包含演出名称、场馆、演出时间、票价区间、票档库存、观演须知等多层嵌套 JSON 结构,很多字段存在可选为空的情况,必须做兼容处理。

点击获取key和secret

完整代码示例

python

import requests
import time
import json

class DamaiDetailApi:
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.cache = {}  # 简易内存缓存
        self.cache_expire = 1800 # 缓存有效期30分钟
        self.base_url = "https://open.alitrip.com/api"

    def get_detail(self, item_id):
        # 读取缓存,减少重复调用
        now_ts = int(time.time())
        if item_id in self.cache:
            cache_data = self.cache[item_id]
            if now_ts - cache_data["ts"] < self.cache_expire:
                return cache_data["data"]

        params = {
            "appkey": self.app_key,
            "itemId": item_id
        }
        headers = {"Content-Type":"application/json;charset=utf-8"}
        resp = requests.get(self.base_url, params=params, headers=headers,timeout=10)
        if resp.status_code != 200:
            return {"code":resp.status_code,"msg":"请求失败","data":None}
        raw = resp.json()
        # 字段归一化清洗
        result = self.data_normalize(raw)
        # 写入缓存
        self.cache[item_id] = {"ts":now_ts,"data":result}
        return result

    def data_normalize(self,raw_data):
        """多层嵌套字段清洗,统一输出结构"""
        if raw_data.get("code") !=0:
            return raw_data
        detail = raw_data.get("data",{})
        output = {
            "item_id":detail.get("itemId"),
            "show_name":detail.get("showName",""),
            "venue":detail.get("venueName",""),
            "show_time_list":[],
            "price_list":[],
            "sale_status":detail.get("saleStatus"),
            "notice":detail.get("notice","")
        }
        # 场次解析
        for show in detail.get("showTimeList",[]):
            output["show_time_list"].append({
                "time":show.get("showTime"),
                "status":show.get("status")
            })
        # 票价档位解析
        for price_info in detail.get("priceList",[]):
            output["price_list"].append({
                "price":price_info.get("price"),
                "stock_status":price_info.get("stockStatus")
            })
        return output

if __name__ == "__main__":
    api = DamaiDetailApi(app_key="your_key",app_secret="your_secret")
    res = api.get_detail(item_id="1074839455822")
    print(json.dumps(res,ensure_ascii=False,indent=2))

核心逻辑解析

代码核心亮点是缓存机制 + 数据归一化。每次请求优先读取内存缓存,短时间重复查询不会频繁调用远程接口,降低接口调用额度消耗。data_normalize函数对多层嵌套返回值做扁平化处理,统一输出字段,自动处理空值,避免业务代码到处写多层get判断。同时提取场次、票价、售卖状态,方便后续业务做价格监控与状态判断。

线上对接踩坑总结

  1. 演出状态实时变动,缓存时间不能设置过长,库存监控场景建议缩短至 5~10 分钟;基础信息同步可延长缓存。

  2. 部分演出存在多时段、多票种,不能只取第一条价格,需要遍历全部票档。

  3. 接口返回字段会随演出类型变化,脱口秀、演唱会、话剧返回字段存在差异,代码要做好空值兜底,防止程序异常。

  4. 请求频率需要限流,短时间批量查询容易触发平台风控,建议单应用 QPS 控制在 5 以内。

群贤毕至

访客