×

某物平台商品详情接口调用实战:嵌套 SKU 数据扁平化处理方案

Ace Ace 发表于2026-10-18 16:28:10 浏览13 评论0

抢沙发发表评论

某物平台商品详情接口调用实战:嵌套 SKU 数据扁平化处理方案

前言

某物平台潮流类商品数据结构和传统电商差异较大,详情接口返回多层嵌套的 SKU、尺码、鉴别、多图信息,直接使用原始 JSON 很难入库。本文核心思路不是简单请求接口,而是增加一层数据归一化处理器,把多层嵌套字段拉平,统一输出结构化字典,同时增加限流保护、指数退避重试,适配商品批量同步业务场景。所有代码仅用于开放接口技术学习,业务接入请遵守平台开放协议。

依赖准备

Python3.8+,依赖 requests 库,执行安装:

bash


pip install requests

点击获取key和secret

完整代码实现

import requests
import time

class WuDetailApi:
    def __init__(self, api_key, timeout=8):
        self.api_key = api_key
        self.timeout = timeout
        self.base_url = "https://api-demo.example.com/wu/item/detail"
        self.session = requests.Session()

    def get_detail(self, item_id: str, max_retry=3):
        """获取某物商品详情,内置重试与数据归一化"""
        params = {
            "api_key": self.api_key,
            "item_id": item_id
        }
        for attempt in range(max_retry):
            try:
                resp = self.session.get(self.base_url, params=params, timeout=self.timeout)
                resp.raise_for_status()
                raw = resp.json()
                if raw.get("code") != 200:
                    return {"success": False, "msg": raw.get("msg"), "data": None}
                # 数据扁平化处理
                raw_data = raw["data"]
                sku_list = []
                for sku in raw_data.get("sku_info", []):
                    sku_list.append({
                        "sku_id": sku.get("sku_id"),
                        "size": sku.get("size_name"),
                        "price": sku.get("sale_price"),
                        "stock": sku.get("stock_num")
                    })
                res = {
                    "success": True,
                    "item_id": raw_data.get("item_id"),
                    "title": raw_data.get("title"),
                    "main_img": raw_data.get("main_image"),
                    "brand": raw_data.get("brand_name"),
                    "sku_list": sku_list,
                    "desc": raw_data.get("desc_info"),
                    "sale_status": raw_data.get("status")
                })
                return res
            except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
                # 指数退避
                time.sleep(2 ** attempt)
                continue
        return {"success": False, "msg": "请求重试耗尽,接口访问失败", "data": None}

if __name__ == "__main__":
    client = WuDetailApi(api_key="替换为你的key")
    result = client.get_detail(item_id="12345678")
    print(result)

代码逻辑解析


  1. 会话复用:使用 Session 保持连接,减少频繁建立 TCP 连接带来的性能损耗,适合批量循环拉取商品。

  2. 指数退避重试:网络超时、连接失败自动重试,等待时间随重试次数变长,防止短时间高频请求触发接口限流。

  3. SKU 扁平化:某物商品 SKU 嵌套层级很深,单独提取尺码、售价、库存,转为一维数组,方便直接写入数据库。

  4. 业务状态校验:同时校验 HTTP 状态码和接口业务 code,区分网络错误、参数错误、商品下架三类异常。


线上踩坑总结

第一,图片地址带有时效 token,不能直接持久化外链,需要下载转存到自有图床,否则一段时间后图片失效。
第二,商品状态区分:在售、售罄、下架、预售,在业务中要单独做状态过滤,下架商品的 SKU 库存字段经常返回空值,代码要做默认值兼容,避免键缺失导致程序崩溃。
第三,接口 QPS 限制,批量同步时单线程每秒请求不超过 2 次,大批量任务建议加分布式限流,429 限流响应需要单独捕获处理。
第四,字段会随平台版本迭代增减,程序读取字段必须使用.get()方式,不能直接索引取值,防止新增 / 下线字段直接抛出异常。

群贤毕至

访客