接口概述
京東開(kāi)放平臺(tái)為開(kāi)發(fā)者提供了強(qiáng)大的商品詳情查詢(xún)接口,借助該接口,開(kāi)發(fā)者僅需通過(guò)SKUID,即可輕松獲取商品的全面詳細(xì)信息,涵蓋商品標(biāo)題、精準(zhǔn)價(jià)格、高清圖片以及豐富的促銷(xiāo)信息等。在當(dāng)前電商市場(chǎng)競(jìng)爭(zhēng)激烈,數(shù)據(jù)精準(zhǔn)獲取與快速響應(yīng)至關(guān)重要的背景下,此接口為開(kāi)發(fā)者提供了高效便捷的數(shù)據(jù)獲取途徑。不過(guò),使用該接口前,開(kāi)發(fā)者需要申請(qǐng)API權(quán)限并獲取認(rèn)證密鑰。
接口特點(diǎn)
- 批量查詢(xún)支持:支持批量查詢(xún)商品信息,一次最多可查詢(xún)20個(gè)SKU,大大提高了數(shù)據(jù)獲取效率,尤其適用于需要大量商品數(shù)據(jù)對(duì)比分析的場(chǎng)景。據(jù)市場(chǎng)調(diào)研,使用批量查詢(xún)功能可使數(shù)據(jù)獲取時(shí)間縮短70%。
- 數(shù)據(jù)格式規(guī)范:返回標(biāo)準(zhǔn)的JSON格式數(shù)據(jù),便于開(kāi)發(fā)者進(jìn)行解析和處理,與主流編程語(yǔ)言的數(shù)據(jù)處理方式高度兼容,降低了開(kāi)發(fā)成本。
- 安全驗(yàn)證機(jī)制:采用簽名驗(yàn)證方式,確保數(shù)據(jù)傳輸?shù)陌踩院屯暾?,有效防止?shù)據(jù)篡改和惡意攻擊,保障了開(kāi)發(fā)者和平臺(tái)的利益。
- 協(xié)議安全可靠:全面支持HTTPS協(xié)議,為數(shù)據(jù)傳輸提供了加密通道,在當(dāng)今網(wǎng)絡(luò)環(huán)境日益復(fù)雜的形勢(shì)下,為數(shù)據(jù)安全保駕護(hù)航。
Java實(shí)現(xiàn)示例
javaimport com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.commons.codec.digest.DigestUtils;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.HashMap;import java.util.Map;import java.util.TreeMap; public class JdProductApi { private static final String API_URL = "https://api.jd.com/routerjson"; private static final String VERSION = "1.0"; public static String queryProductDetail(long skuId, String appKey, String appSecret) { try { // 精心構(gòu)造請(qǐng)求參數(shù) Map<String, Object> params = new TreeMap<>(); params.put("method", "jd.union.open.goods.detail.query"); params.put("app_key", appKey); params.put("timestamp", System.currentTimeMillis()); params.put("v", VERSION); params.put("format", "json"); // 構(gòu)建商品請(qǐng)求參數(shù) JSONObject goodsReq = new JSONObject(); goodsReq.put("skuIds", new long[]{skuId}); params.put("goodsReq", goodsReq); // 嚴(yán)格生成簽名 String sign = generateSign(params, appSecret); params.put("sign", sign); // 準(zhǔn)確發(fā)送請(qǐng)求 URL url = new URL(API_URL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.getOutputStream().write(JSON.toJSONString(params).getBytes()); // 高效處理響應(yīng) BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } return response.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } private static String generateSign(Map<String, Object> params, String appSecret) { StringBuilder sb = new StringBuilder(appSecret); for (Map.Entry<String, Object> entry : params.entrySet()) { sb.append(entry.getKey()).append(entry.getValue()); } sb.append(appSecret); return DigestUtils.md5Hex(sb.toString()).toUpperCase(); }}
Python實(shí)現(xiàn)示例
pythonimport hashlibimport timeimport jsonimport requests class JdProductApi: API_URL = "https://api.jd.com/routerjson" VERSION = "1.0" @staticmethod def query_product_detail(sku_id, app_key, app_secret): params = { "method": "jd.union.open.goods.detail.query", "app_key": app_key, "timestamp": int(time.time() * 1000), "v": JdProductApi.VERSION, "format": "json", "goodsReq": {"skuIds": [sku_id]} } # 嚴(yán)謹(jǐn)生成簽名 sign = JdProductApi.generate_sign(params, app_secret) params["sign"] = sign # 可靠發(fā)送請(qǐng)求 response = requests.post( JdProductApi.API_URL, json=params, headers={"Content-Type": "application/json"} ) return response.json() @staticmethod def generate_sign(params, app_secret): param_str = app_secret for key in sorted(params.keys()): param_str += f"{key}{params[key]}" param_str += app_secret return hashlib.md5(param_str.encode()).hexdigest().upper()
接口返回示例
json{ "code": 0, "message": "success", "data": { "skuId": 1234567, "skuName": "示例商品名稱(chēng)", "price": 299.00, "imageList": ["http://img1.jpg", "http://img2.jpg"], "brandName": "示例品牌", "category": "電子產(chǎn)品", "shopId": 10001, "shopName": "官方旗艦店", "promotionList": [ { "promotionId": 1, "promotionName": "滿(mǎn)299減30", "startTime": "2025-05-01 00:00:00", "endTime": "2025-05-31 23:59:59" } ] } }
開(kāi)發(fā)注意事項(xiàng)
- 權(quán)限申請(qǐng)先行:在使用接口前,務(wù)必先在京東開(kāi)放平臺(tái)申請(qǐng)API權(quán)限,這是使用接口的前提條件,否則無(wú)法正常調(diào)用接口獲取數(shù)據(jù)。
- 頻率限制牢記:每個(gè)應(yīng)用都有調(diào)用頻率限制,通常為100次/秒。開(kāi)發(fā)者需要合理規(guī)劃調(diào)用策略,避免因頻繁調(diào)用觸發(fā)限制,導(dǎo)致數(shù)據(jù)獲取中斷。
- 簽名算法精準(zhǔn):簽名算法必須嚴(yán)格按照文檔要求實(shí)現(xiàn),任何細(xì)微的偏差都可能導(dǎo)致簽名驗(yàn)證失敗,從而無(wú)法獲取數(shù)據(jù)。
- 協(xié)議選擇恰當(dāng):建議使用HTTPS協(xié)議進(jìn)行數(shù)據(jù)傳輸,以保證傳輸過(guò)程的安全性,防止數(shù)據(jù)泄露和篡改。
- 異常處理全面:要充分考慮并處理可能出現(xiàn)的異常情況,如網(wǎng)絡(luò)超時(shí)、參數(shù)錯(cuò)誤等,確保程序的穩(wěn)定性和可靠性。
以上代碼提供了Java和Python兩種語(yǔ)言的實(shí)現(xiàn)示例,開(kāi)發(fā)者可以根據(jù)自己的技術(shù)棧選擇合適的版本。實(shí)際使用時(shí),需要將appKey和appSecret替換為實(shí)際獲取的值,并添加適當(dāng)?shù)腻e(cuò)誤處理邏輯,以應(yīng)對(duì)各種可能出現(xiàn)的異常情況。