5
5
"errors"
6
6
"github.com/cliod/jd-go/common"
7
7
"github.com/cliod/jd-go/log"
8
+ "strings"
8
9
)
9
10
10
11
// 京东联盟API
@@ -81,7 +82,24 @@ type Service interface {
81
82
// v 返回数据解析对象(指针)
82
83
// method 请求路由方法
83
84
// 业务参数
85
+ // 可通过 Request 方法执行其他未封装的京东联盟API
84
86
Request (v interface {}, method Method , param map [string ]interface {}) error
87
+
88
+ // 参数校验
89
+ CheckRequiredParameters (v interface {}) error
90
+
91
+ // 获取解析正确结果
92
+ GetResult (Result , error ) ([]byte , error )
93
+ // 解析并获取正确结果
94
+ ParseResult (map [string ]interface {}, ResponseKey ) (map [string ]interface {}, error )
95
+
96
+ // 开启验证等级
97
+ Validate (VCode )
98
+ // 结果为map对象时的解封装等级,默认1
99
+ // 0 不做解析,全部返回
100
+ // 1 解析返回1层
101
+ // 2 解析返回主要数据
102
+ SetMapResultParseLevel (level int )
85
103
}
86
104
87
105
type ServiceImpl struct {
@@ -96,8 +114,14 @@ type ServiceImpl struct {
96
114
activityService ActivityService
97
115
positionService PositionService
98
116
99
- //Deprecated: 弃用
100
117
otherService OtherService
118
+
119
+ // 是否开启参数非空校验
120
+ validateEmpty bool
121
+ // 结果为map对象时的解封装等级,默认1
122
+ mapResultParseLevel int
123
+ // 请求的结果解封装等级 todo
124
+ resultParseLevel int
101
125
}
102
126
103
127
// 默认京东联盟
@@ -107,7 +131,10 @@ func NewJdClient(appKey, secretKey string) Service {
107
131
108
132
// 默认京东联盟
109
133
func NewJdService (appKey , secretKey string ) Service {
110
- return NewJdUnionService (appKey , secretKey )
134
+ service := NewJdUnionService (appKey , secretKey )
135
+ // 不做解析,兼容旧版本
136
+ service .SetMapResultParseLevel (0 )
137
+ return service
111
138
}
112
139
113
140
func NewJdUnionService (appKey , secretKey string ) Service {
@@ -133,124 +160,127 @@ func newService(appKey, secretKey, routApi string) Service {
133
160
impl .positionService = newPositionService (impl )
134
161
135
162
impl .otherService = newOtherService (impl .positionService , impl .activityService )
163
+
164
+ impl .validateEmpty = false
165
+ impl .mapResultParseLevel = 1
136
166
return impl
137
167
}
138
168
139
- func (s * ServiceImpl ) Get (url string , args interface {}) ([]byte , error ) {
140
- return s .service .Get (url , args )
169
+ func (ser * ServiceImpl ) Get (url string , args interface {}) ([]byte , error ) {
170
+ return ser .service .Get (url , args )
141
171
}
142
172
143
- func (s * ServiceImpl ) GetFor (v interface {}, url string , args * Param ) error {
144
- res , err := s .Get (url , args )
173
+ func (ser * ServiceImpl ) GetFor (v interface {}, url string , args * Param ) error {
174
+ res , err := ser .Get (url , args )
145
175
if err != nil {
146
176
log .Error ("Request:" , err )
147
177
return err
148
178
}
149
179
return json .Unmarshal (res , v )
150
180
}
151
181
152
- func (s * ServiceImpl ) GetGoodsService () GoodsService {
153
- return s .goodsService
182
+ func (ser * ServiceImpl ) GetGoodsService () GoodsService {
183
+ return ser .goodsService
154
184
}
155
185
156
- func (s * ServiceImpl ) GetCouponService () CouponService {
157
- return s .couponService
186
+ func (ser * ServiceImpl ) GetCouponService () CouponService {
187
+ return ser .couponService
158
188
}
159
189
160
- func (s * ServiceImpl ) GetPromoteService () PromotionService {
161
- return s .promoteService
190
+ func (ser * ServiceImpl ) GetPromoteService () PromotionService {
191
+ return ser .promoteService
162
192
}
163
193
164
- func (s * ServiceImpl ) SetGoodsService (service GoodsService ) {
165
- s .goodsService = service
194
+ func (ser * ServiceImpl ) SetGoodsService (service GoodsService ) {
195
+ ser .goodsService = service
166
196
}
167
197
168
- func (s * ServiceImpl ) SetCouponService (service CouponService ) {
169
- s .couponService = service
198
+ func (ser * ServiceImpl ) SetCouponService (service CouponService ) {
199
+ ser .couponService = service
170
200
}
171
201
172
- func (s * ServiceImpl ) SetPromoteService (service PromotionService ) {
173
- s .promoteService = service
202
+ func (ser * ServiceImpl ) SetPromoteService (service PromotionService ) {
203
+ ser .promoteService = service
174
204
}
175
205
176
- func (s * ServiceImpl ) GetGiftService () GiftService {
177
- return s .giftService
206
+ func (ser * ServiceImpl ) GetGiftService () GiftService {
207
+ return ser .giftService
178
208
}
179
209
180
- func (s * ServiceImpl ) GetOrderService () OrderService {
181
- return s .orderService
210
+ func (ser * ServiceImpl ) GetOrderService () OrderService {
211
+ return ser .orderService
182
212
}
183
213
184
- func (s * ServiceImpl ) GetActivityService () ActivityService {
185
- return s .activityService
214
+ func (ser * ServiceImpl ) GetActivityService () ActivityService {
215
+ return ser .activityService
186
216
}
187
217
188
- func (s * ServiceImpl ) GetPositionService () PositionService {
189
- return s .positionService
218
+ func (ser * ServiceImpl ) GetPositionService () PositionService {
219
+ return ser .positionService
190
220
}
191
221
192
- func (s * ServiceImpl ) SetGiftService (service GiftService ) {
193
- s .giftService = service
222
+ func (ser * ServiceImpl ) SetGiftService (service GiftService ) {
223
+ ser .giftService = service
194
224
}
195
225
196
- func (s * ServiceImpl ) SetActivityService (service ActivityService ) {
197
- s .activityService = service
226
+ func (ser * ServiceImpl ) SetActivityService (service ActivityService ) {
227
+ ser .activityService = service
198
228
}
199
229
200
- func (s * ServiceImpl ) SetPositionService (service PositionService ) {
201
- s .positionService = service
230
+ func (ser * ServiceImpl ) SetPositionService (service PositionService ) {
231
+ ser .positionService = service
202
232
}
203
233
204
- func (s * ServiceImpl ) SetOrderService (service OrderService ) {
205
- s .orderService = service
234
+ func (ser * ServiceImpl ) SetOrderService (service OrderService ) {
235
+ ser .orderService = service
206
236
}
207
237
208
238
// Deprecated: 使用新接口: GetPositionService 和 GetActivityService
209
- func (s * ServiceImpl ) GetOtherService () OtherService {
210
- return s .otherService
239
+ func (ser * ServiceImpl ) GetOtherService () OtherService {
240
+ return ser .otherService
211
241
}
212
242
213
243
// Deprecated: 使用新接口: SetPositionService 和 SetActivityService
214
- func (s * ServiceImpl ) SetOtherService (service OtherService ) {
215
- s .otherService = service
244
+ func (ser * ServiceImpl ) SetOtherService (service OtherService ) {
245
+ ser .otherService = service
216
246
}
217
247
218
- func (s * ServiceImpl ) GetConfig () * Config {
219
- return s .config
248
+ func (ser * ServiceImpl ) GetConfig () * Config {
249
+ return ser .config
220
250
}
221
251
222
- func (s * ServiceImpl ) SetConfig (config * Config ) {
223
- s .config = config
252
+ func (ser * ServiceImpl ) SetConfig (config * Config ) {
253
+ ser .config = config
224
254
}
225
255
226
- func (s * ServiceImpl ) SetHttpService (service common.Service ) {
227
- s .service = service
256
+ func (ser * ServiceImpl ) SetHttpService (service common.Service ) {
257
+ ser .service = service
228
258
}
229
259
230
- func (s * ServiceImpl ) GetRouteApi () string {
231
- return s .GetConfig ().RouteApi
260
+ func (ser * ServiceImpl ) GetRouteApi () string {
261
+ return ser .GetConfig ().RouteApi
232
262
}
233
263
234
- func (s * ServiceImpl ) SetRouteApi (api string ) {
235
- s .GetConfig ().RouteApi = api
264
+ func (ser * ServiceImpl ) SetRouteApi (api string ) {
265
+ ser .GetConfig ().RouteApi = api
236
266
}
237
267
238
- func (s * ServiceImpl ) Sign (method Method , param map [string ]interface {}) (* Param , error ) {
239
- c := s .GetConfig ()
268
+ func (ser * ServiceImpl ) Sign (method Method , param map [string ]interface {}) (* Param , error ) {
269
+ c := ser .GetConfig ()
240
270
c .Method = method
241
271
parameter := newParameter (c , param )
242
272
parameter .attachSign ()
243
273
err := parameter .CheckRequiredParams ()
244
274
return NewParam (parameter ), err
245
275
}
246
276
247
- func (s * ServiceImpl ) Request (v interface {}, method Method , param map [string ]interface {}) error {
248
- p , err := s .Sign (method , param )
277
+ func (ser * ServiceImpl ) Request (v interface {}, method Method , param map [string ]interface {}) error {
278
+ p , err := ser .Sign (method , param )
249
279
if err != nil {
250
280
log .Error ("Sign:" , err )
251
281
return err
252
282
}
253
- err = s .GetFor (v , s .GetConfig ().RouteApi , p )
283
+ err = ser .GetFor (v , ser .GetConfig ().RouteApi , p )
254
284
if err != nil {
255
285
log .Error ("Result Err:" , err )
256
286
} else {
@@ -260,30 +290,105 @@ func (s *ServiceImpl) Request(v interface{}, method Method, param map[string]int
260
290
}
261
291
262
292
// 非必填参数为空不会序列化
263
- func (s * ServiceImpl ) CheckRequiredParameters (v interface {}) error {
293
+ func (ser * ServiceImpl ) CheckRequiredParameters (v interface {}) error {
294
+ if ! ser .validateEmpty {
295
+ return nil
296
+ }
264
297
var param map [string ]interface {}
265
298
param , ok := v .(map [string ]interface {})
266
299
if ! ok {
267
300
bs , err := json .Marshal (v )
268
301
if err != nil {
302
+ log .Error ("Validate Empty: " , err )
269
303
return err
270
304
}
271
305
err = json .Unmarshal (bs , & param )
272
306
if err != nil {
307
+ log .Error ("Validate Empty: " , err )
273
308
return err
274
309
}
275
310
}
276
311
for _ , v := range param {
277
312
if s , ok := v .(string ); ok {
278
313
if s == "" {
279
- return errors .New ("参数为空" )
314
+ err := errors .New ("参数为空" )
315
+ log .Error ("Validate Empty: " , err )
316
+ return err
280
317
}
281
318
}
282
319
}
283
320
return nil
284
321
}
285
322
286
323
// Deprecated: 使用新接口: Request
287
- func (s * ServiceImpl ) Do (v interface {}, method Method , param map [string ]interface {}) error {
288
- return s .Request (v , method , param )
324
+ func (ser * ServiceImpl ) Do (v interface {}, method Method , param map [string ]interface {}) error {
325
+ return ser .Request (v , method , param )
326
+ }
327
+
328
+ func (ser * ServiceImpl ) GetResult (res Result , err error ) ([]byte , error ) {
329
+ if err != nil {
330
+ log .Warn ("Get Result: " , err )
331
+ return nil , err
332
+ }
333
+ if res .IsSuccess () {
334
+ return nil , res
335
+ }
336
+ return res .GetResult (), nil
337
+ }
338
+
339
+ func (ser * ServiceImpl ) ParseResult (res map [string ]interface {}, key ResponseKey ) (map [string ]interface {}, error ) {
340
+ if ser .mapResultParseLevel == 0 {
341
+ return res , nil
342
+ } else {
343
+ //错误信息处理
344
+ if res ["error_response" ] != nil {
345
+ var errResponse * BaseResult
346
+ errJson , err := json .Marshal (res )
347
+ if err != nil {
348
+ log .Error ("Parse Result: " , err )
349
+ return nil , err
350
+ }
351
+ if err := json .Unmarshal (errJson , & errResponse ); err != nil {
352
+ log .Error ("Parse Result" , err )
353
+ return nil , err
354
+ }
355
+ return nil , errResponse
356
+ }
357
+ resp , ok := res [key .String ()].(map [string ]interface {})
358
+ if ok {
359
+ if ser .mapResultParseLevel == 1 {
360
+ return resp , nil
361
+ }
362
+ var resName string
363
+ if strings .Contains (key .String (), "response" ) {
364
+ resName = "result"
365
+ } else {
366
+ resName = "queryResult"
367
+ }
368
+ str := resp [resName ].(string )
369
+ r := make (map [string ]interface {})
370
+ err := json .Unmarshal ([]byte (str ), & r )
371
+ if err != nil {
372
+ log .Error ("Parse Result: " , err )
373
+ return nil , err
374
+ }
375
+ return r , nil
376
+ }
377
+ return nil , errors .New ("error parse result" )
378
+ }
379
+ }
380
+
381
+ func (ser * ServiceImpl ) Validate (code VCode ) {
382
+ switch code {
383
+ case NotEmpty :
384
+ ser .validateEmpty = true
385
+ case Non :
386
+ ser .validateEmpty = false
387
+ default :
388
+ }
389
+ //todo 其他校验
390
+ }
391
+
392
+ func (ser * ServiceImpl ) SetMapResultParseLevel (level int ) {
393
+ ser .mapResultParseLevel = level
289
394
}
0 commit comments