ztk_rust_sdk/jd/api.rs
1//! 京东平台 API 实现
2//!
3//! 提供京东平台相关的 API 调用功能,包括:
4//! - 商品转链
5//! - 京粉精选商品
6//! - 订单查询
7//! - 商品详情
8//! - 朋友圈火爆商品
9
10use crate::client::ZtkClient;
11use crate::common::http::{build_params_with_appkey, url_encode};
12use crate::error::ZtkResult;
13
14use super::request::{
15 JdConvertRequest, JdGoodsDetailRequest, JdHotGoodsRequest, JdOrderQueryRequest,
16 JingfenGoodsRequest,
17};
18use super::response::{
19 JdConvertResponse, JdGoodsDetailResponse, JdHotGoodsResponse, JdOrderResponse,
20 JingfenGoodsResponse,
21};
22
23/// 京东平台 API
24///
25/// 提供京东平台相关的 API 调用方法
26///
27/// # Example
28///
29/// ```rust,ignore
30/// use ztk_rust_sdk::ZtkClient;
31/// use ztk_rust_sdk::jd::{JdConvertRequest, JdChainType};
32///
33/// #[tokio::main]
34/// async fn main() -> ztk_rust_sdk::ZtkResult<()> {
35/// let client = ZtkClient::new("your_appkey").build()?;
36///
37/// let request = JdConvertRequest::new("https://item.jd.com/123456.html", "your_union_id")
38/// .chain_type(JdChainType::Short);
39///
40/// let result = client.jd().convert(request).await?;
41/// println!("转链结果: {:?}", result);
42///
43/// Ok(())
44/// }
45/// ```
46pub struct JdApi<'a> {
47 /// 客户端引用
48 client: &'a ZtkClient,
49}
50
51impl<'a> JdApi<'a> {
52 /// 创建京东 API 实例
53 ///
54 /// # Arguments
55 ///
56 /// * `client` - ZtkClient 引用
57 pub fn new(client: &'a ZtkClient) -> Self {
58 Self { client }
59 }
60
61 /// 获取客户端引用
62 #[allow(dead_code)]
63 pub(crate) fn client(&self) -> &ZtkClient {
64 self.client
65 }
66
67 /// 京东转链
68 ///
69 /// 将商品链接或 SKU ID 转换为推广链接
70 ///
71 /// # Arguments
72 ///
73 /// * `request` - 转链请求参数
74 ///
75 /// # Returns
76 ///
77 /// 返回转链结果,包含推广链接
78 ///
79 /// # Example
80 ///
81 /// ```rust,ignore
82 /// let request = JdConvertRequest::new("https://item.jd.com/123456.html", "your_union_id")
83 /// .position_id("12345")
84 /// .chain_type(JdChainType::Short);
85 /// let result = client.jd().convert(request).await?;
86 /// ```
87 pub async fn convert(&self, request: JdConvertRequest) -> ZtkResult<JdConvertResponse> {
88 // 对 material_id 进行 URL 编码
89 let mut encoded_request = request.clone();
90 encoded_request.material_id = url_encode(&request.material_id);
91
92 // 如果有 coupon_url,也需要编码
93 if let Some(ref coupon_url) = request.coupon_url {
94 encoded_request.coupon_url = Some(url_encode(coupon_url));
95 }
96
97 let params = build_params_with_appkey(self.client.appkey(), &encoded_request)?;
98 self.client
99 .http_client()
100 .get(
101 "/api/open_jing_union_open_promotion_byunionid_get.ashx",
102 ¶ms,
103 )
104 .await
105 }
106
107 /// 京粉精选商品
108 ///
109 /// 获取京粉精选商品列表
110 ///
111 /// # Arguments
112 ///
113 /// * `request` - 京粉精选商品请求参数
114 ///
115 /// # Returns
116 ///
117 /// 返回京粉精选商品列表
118 ///
119 /// # Example
120 ///
121 /// ```rust,ignore
122 /// let request = JingfenGoodsRequest::new(JdEliteId::HotSale)
123 /// .page_index(1)
124 /// .page_size(20);
125 /// let result = client.jd().jingfen_goods(request).await?;
126 /// ```
127 pub async fn jingfen_goods(
128 &self,
129 request: JingfenGoodsRequest,
130 ) -> ZtkResult<JingfenGoodsResponse> {
131 let params = build_params_with_appkey(self.client.appkey(), &request)?;
132 self.client
133 .http_client()
134 .get(
135 "/api/open_jing_union_open_goods_jingfen_query.ashx",
136 ¶ms,
137 )
138 .await
139 }
140
141 /// 订单查询
142 ///
143 /// 查询京东联盟订单
144 ///
145 /// # Arguments
146 ///
147 /// * `request` - 订单查询请求参数
148 ///
149 /// # Returns
150 ///
151 /// 返回订单列表数据
152 ///
153 /// # Example
154 ///
155 /// ```rust,ignore
156 /// let request = JdOrderQueryRequest::new("2024-01-01 00:00:00")
157 /// .end_time("2024-01-31 23:59:59")
158 /// .query_type(JdOrderQueryType::OrderTime)
159 /// .page_no(1);
160 /// let result = client.jd().query_orders(request).await?;
161 /// ```
162 pub async fn query_orders(&self, request: JdOrderQueryRequest) -> ZtkResult<JdOrderResponse> {
163 let params = build_params_with_appkey(self.client.appkey(), &request)?;
164 self.client
165 .http_client()
166 .get("/api/open_jing_union_open_order_query.ashx", ¶ms)
167 .await
168 }
169
170 /// 商品详情
171 ///
172 /// 获取京东商品详情信息
173 ///
174 /// # Arguments
175 ///
176 /// * `request` - 商品详情请求参数
177 ///
178 /// # Returns
179 ///
180 /// 返回商品详情信息
181 ///
182 /// # Example
183 ///
184 /// ```rust,ignore
185 /// let request = JdGoodsDetailRequest::new("10025768652616");
186 /// let result = client.jd().goods_detail(request).await?;
187 /// ```
188 pub async fn goods_detail(
189 &self,
190 request: JdGoodsDetailRequest,
191 ) -> ZtkResult<JdGoodsDetailResponse> {
192 let params = build_params_with_appkey(self.client.appkey(), &request)?;
193 self.client
194 .http_client()
195 .get("/api/open_jing_union_open_goods_query.ashx", ¶ms)
196 .await
197 }
198
199 /// 朋友圈火爆商品
200 ///
201 /// 获取京东朋友圈火爆商品列表,包含精编社群推广文案
202 ///
203 /// # Arguments
204 ///
205 /// * `request` - 朋友圈火爆商品请求参数
206 ///
207 /// # Returns
208 ///
209 /// 返回朋友圈火爆商品列表
210 ///
211 /// # Example
212 ///
213 /// ```rust,ignore
214 /// let request = JdHotGoodsRequest::new()
215 /// .page_index(1)
216 /// .page_size(20)
217 /// .keyword("手机");
218 /// let result = client.jd().hot_goods(request).await?;
219 /// ```
220 pub async fn hot_goods(&self, request: JdHotGoodsRequest) -> ZtkResult<JdHotGoodsResponse> {
221 let params = build_params_with_appkey(self.client.appkey(), &request)?;
222 self.client
223 .http_client()
224 .get("/api/open_jing_goods_list.ashx", ¶ms)
225 .await
226 }
227}
228
229#[cfg(test)]
230mod tests {
231 use super::*;
232
233 #[test]
234 fn test_jd_api_creation() {
235 let client = ZtkClient::new("test_appkey").build().unwrap();
236 let jd = client.jd();
237 assert_eq!(jd.client().appkey(), "test_appkey");
238 }
239}