当当平台商品详情接口设计与调用指南 接口名称
GET /api/product/detail 图书商品核心信息查询接口
请求参数说明 参数名称 类型 是否必填 说明 isbn string 是 国际标准书号(支持13位/10位) product_id string 否 平台内部商品编号(与ISBN二选一) need_stock bool 否 是否返回库存数据(默认false) detail_level int 否 详情级别(1基础/2扩展/3完整) 认证鉴权机制 python Copy Code import requests import hmac from urllib.parse import urlencode
def generate_sign(secret, params): """HMAC-SHA256签名生成器""" query = urlencode(sorted(params.items())) return hmac.new(secret.encode(), query.encode(), 'sha256').hexdigest()
开发者凭证
CLIENT_ID = "YOUR_CLIENT_ID" CLIENT_SECRET = "YOUR_SECRET_KEY"
构造请求示例
params = { "isbn": "9787108009821", "need_stock": "true", "timestamp": str(int(time.time())), "nonce": "a3d8f7" # 6位随机字符串 }
生成签名
signature = generate_sign(CLIENT_SECRET, params)
添加认证头
headers = { "X-Client-Id": CLIENT_ID, "X-Auth-Sign": signature }
响应数据结构(JSON) json Copy Code { "code": 200, "data": { "base_info": { "product_id": "21068943", "isbn": "9787108009821", "title": "中国历代政治得失", "author": "钱穆", "press": "生活·读书·新知三联书店", "edition": "第2版", "page_count": 188, "paper_type": "胶版纸" }, "price_info": { "retail_price": 38.00, "dangdang_price": 26.60, "vip_price": 24.80, "stock_status": 3 // 1-充足 2-紧张 3-预售 }, "content_info": { "catalog": "第一章 汉代...", "abstract": "本书为作者的专题演讲合集...", "preview_pages": [ "img.example.com/preview/pag…", "img.example.com/preview/pag…" ] }, "media_info": { "cover_image": "img.example.com/cover.jpg", "audio_preview": "audio.example.com/chapter1.mp…", "video_intro": "video.example.com/trailer.mp4" } } }
典型错误场景 400 错误类 json Copy Code { "code": 40012, "message": "ISBN格式校验失败", "solution": "请检查ISBN编号是否符合规范" }
403 错误类 json Copy Code { "code": 40309, "message": "签名验证未通过", "documentation": "open.dangdang.com/docs/signat…" }
404 错误类 json Copy Code { "code": 40401, "message": "指定商品不存在", "retry": false }
代码调用示例(Python) python Copy Code def get_book_detail(isbn): API_ENDPOINT = "api.open.dangdang.com/product/det…"
params = {
"isbn": isbn,
"timestamp": str(int(time.time())),
"nonce": secrets.token_hex(3)
}
# 签名生成
params["sign"] = generate_sign(CLIENT_SECRET, params)
try:
response = requests.get(
API_ENDPOINT,
params=params,
headers={"X-Client-Id": CLIENT_ID},
timeout=5
)
response.raise_for_status()
# 处理多版本数据
if response.json().get('data', {}).get('ebook'):
return process_ebook_data(response.json())
else:
return process_paperbook_data(response.json())
except requests.exceptions.HTTPError as err:
handle_api_error(err.response.json())
except requests.exceptions.Timeout:
logging.error("API请求超时")
开发注意事项
数据缓存策略 建议本地缓存商品基础信息(缓存时间<=6小时),避免高频请求
特殊商品处理
电子书资源需检查has_ebook字段 套装图书注意series_info嵌套结构
流量控制
免费版:10次/秒 企业版:50次/秒(需签约商务协议)
数据展示限制 试读章节不得展示超过全书20%的内容
注:本示例代码基于当当开放平台2023年接口规范模拟实现,实际接入请以官方最新文档为准,严禁用于非法数据采集行为