Skip to content

Commit 2c00ae8

Browse files
authored
Merge pull request #4
feat(0.7.x): 优化
2 parents 36b2b66 + 47d63c6 commit 2c00ae8

12 files changed

+816
-464
lines changed

const.go

+8
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,11 @@ const (
144144
JosRootEndpoint = "https://api.jd.com/routerjson" // 宙斯API路由 🤣: 参数: 360buy_param_json
145145
BaseUrl = UnionRootEndpoint
146146
)
147+
148+
// 参数验证/校验等级
149+
type VCode int
150+
151+
const (
152+
Non VCode = iota // 不校验😅
153+
NotEmpty
154+
)

jd.go

+162-57
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"github.com/cliod/jd-go/common"
77
"github.com/cliod/jd-go/log"
8+
"strings"
89
)
910

1011
// 京东联盟API
@@ -81,7 +82,24 @@ type Service interface {
8182
// v 返回数据解析对象(指针)
8283
// method 请求路由方法
8384
// 业务参数
85+
// 可通过 Request 方法执行其他未封装的京东联盟API
8486
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)
85103
}
86104

87105
type ServiceImpl struct {
@@ -96,8 +114,14 @@ type ServiceImpl struct {
96114
activityService ActivityService
97115
positionService PositionService
98116

99-
//Deprecated: 弃用
100117
otherService OtherService
118+
119+
// 是否开启参数非空校验
120+
validateEmpty bool
121+
// 结果为map对象时的解封装等级,默认1
122+
mapResultParseLevel int
123+
// 请求的结果解封装等级 todo
124+
resultParseLevel int
101125
}
102126

103127
// 默认京东联盟
@@ -107,7 +131,10 @@ func NewJdClient(appKey, secretKey string) Service {
107131

108132
// 默认京东联盟
109133
func NewJdService(appKey, secretKey string) Service {
110-
return NewJdUnionService(appKey, secretKey)
134+
service := NewJdUnionService(appKey, secretKey)
135+
// 不做解析,兼容旧版本
136+
service.SetMapResultParseLevel(0)
137+
return service
111138
}
112139

113140
func NewJdUnionService(appKey, secretKey string) Service {
@@ -133,124 +160,127 @@ func newService(appKey, secretKey, routApi string) Service {
133160
impl.positionService = newPositionService(impl)
134161

135162
impl.otherService = newOtherService(impl.positionService, impl.activityService)
163+
164+
impl.validateEmpty = false
165+
impl.mapResultParseLevel = 1
136166
return impl
137167
}
138168

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)
141171
}
142172

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)
145175
if err != nil {
146176
log.Error("Request:", err)
147177
return err
148178
}
149179
return json.Unmarshal(res, v)
150180
}
151181

152-
func (s *ServiceImpl) GetGoodsService() GoodsService {
153-
return s.goodsService
182+
func (ser *ServiceImpl) GetGoodsService() GoodsService {
183+
return ser.goodsService
154184
}
155185

156-
func (s *ServiceImpl) GetCouponService() CouponService {
157-
return s.couponService
186+
func (ser *ServiceImpl) GetCouponService() CouponService {
187+
return ser.couponService
158188
}
159189

160-
func (s *ServiceImpl) GetPromoteService() PromotionService {
161-
return s.promoteService
190+
func (ser *ServiceImpl) GetPromoteService() PromotionService {
191+
return ser.promoteService
162192
}
163193

164-
func (s *ServiceImpl) SetGoodsService(service GoodsService) {
165-
s.goodsService = service
194+
func (ser *ServiceImpl) SetGoodsService(service GoodsService) {
195+
ser.goodsService = service
166196
}
167197

168-
func (s *ServiceImpl) SetCouponService(service CouponService) {
169-
s.couponService = service
198+
func (ser *ServiceImpl) SetCouponService(service CouponService) {
199+
ser.couponService = service
170200
}
171201

172-
func (s *ServiceImpl) SetPromoteService(service PromotionService) {
173-
s.promoteService = service
202+
func (ser *ServiceImpl) SetPromoteService(service PromotionService) {
203+
ser.promoteService = service
174204
}
175205

176-
func (s *ServiceImpl) GetGiftService() GiftService {
177-
return s.giftService
206+
func (ser *ServiceImpl) GetGiftService() GiftService {
207+
return ser.giftService
178208
}
179209

180-
func (s *ServiceImpl) GetOrderService() OrderService {
181-
return s.orderService
210+
func (ser *ServiceImpl) GetOrderService() OrderService {
211+
return ser.orderService
182212
}
183213

184-
func (s *ServiceImpl) GetActivityService() ActivityService {
185-
return s.activityService
214+
func (ser *ServiceImpl) GetActivityService() ActivityService {
215+
return ser.activityService
186216
}
187217

188-
func (s *ServiceImpl) GetPositionService() PositionService {
189-
return s.positionService
218+
func (ser *ServiceImpl) GetPositionService() PositionService {
219+
return ser.positionService
190220
}
191221

192-
func (s *ServiceImpl) SetGiftService(service GiftService) {
193-
s.giftService = service
222+
func (ser *ServiceImpl) SetGiftService(service GiftService) {
223+
ser.giftService = service
194224
}
195225

196-
func (s *ServiceImpl) SetActivityService(service ActivityService) {
197-
s.activityService = service
226+
func (ser *ServiceImpl) SetActivityService(service ActivityService) {
227+
ser.activityService = service
198228
}
199229

200-
func (s *ServiceImpl) SetPositionService(service PositionService) {
201-
s.positionService = service
230+
func (ser *ServiceImpl) SetPositionService(service PositionService) {
231+
ser.positionService = service
202232
}
203233

204-
func (s *ServiceImpl) SetOrderService(service OrderService) {
205-
s.orderService = service
234+
func (ser *ServiceImpl) SetOrderService(service OrderService) {
235+
ser.orderService = service
206236
}
207237

208238
// Deprecated: 使用新接口: GetPositionService 和 GetActivityService
209-
func (s *ServiceImpl) GetOtherService() OtherService {
210-
return s.otherService
239+
func (ser *ServiceImpl) GetOtherService() OtherService {
240+
return ser.otherService
211241
}
212242

213243
// 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
216246
}
217247

218-
func (s *ServiceImpl) GetConfig() *Config {
219-
return s.config
248+
func (ser *ServiceImpl) GetConfig() *Config {
249+
return ser.config
220250
}
221251

222-
func (s *ServiceImpl) SetConfig(config *Config) {
223-
s.config = config
252+
func (ser *ServiceImpl) SetConfig(config *Config) {
253+
ser.config = config
224254
}
225255

226-
func (s *ServiceImpl) SetHttpService(service common.Service) {
227-
s.service = service
256+
func (ser *ServiceImpl) SetHttpService(service common.Service) {
257+
ser.service = service
228258
}
229259

230-
func (s *ServiceImpl) GetRouteApi() string {
231-
return s.GetConfig().RouteApi
260+
func (ser *ServiceImpl) GetRouteApi() string {
261+
return ser.GetConfig().RouteApi
232262
}
233263

234-
func (s *ServiceImpl) SetRouteApi(api string) {
235-
s.GetConfig().RouteApi = api
264+
func (ser *ServiceImpl) SetRouteApi(api string) {
265+
ser.GetConfig().RouteApi = api
236266
}
237267

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()
240270
c.Method = method
241271
parameter := newParameter(c, param)
242272
parameter.attachSign()
243273
err := parameter.CheckRequiredParams()
244274
return NewParam(parameter), err
245275
}
246276

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)
249279
if err != nil {
250280
log.Error("Sign:", err)
251281
return err
252282
}
253-
err = s.GetFor(v, s.GetConfig().RouteApi, p)
283+
err = ser.GetFor(v, ser.GetConfig().RouteApi, p)
254284
if err != nil {
255285
log.Error("Result Err:", err)
256286
} else {
@@ -260,30 +290,105 @@ func (s *ServiceImpl) Request(v interface{}, method Method, param map[string]int
260290
}
261291

262292
// 非必填参数为空不会序列化
263-
func (s *ServiceImpl) CheckRequiredParameters(v interface{}) error {
293+
func (ser *ServiceImpl) CheckRequiredParameters(v interface{}) error {
294+
if !ser.validateEmpty {
295+
return nil
296+
}
264297
var param map[string]interface{}
265298
param, ok := v.(map[string]interface{})
266299
if !ok {
267300
bs, err := json.Marshal(v)
268301
if err != nil {
302+
log.Error("Validate Empty: ", err)
269303
return err
270304
}
271305
err = json.Unmarshal(bs, &param)
272306
if err != nil {
307+
log.Error("Validate Empty: ", err)
273308
return err
274309
}
275310
}
276311
for _, v := range param {
277312
if s, ok := v.(string); ok {
278313
if s == "" {
279-
return errors.New("参数为空")
314+
err := errors.New("参数为空")
315+
log.Error("Validate Empty: ", err)
316+
return err
280317
}
281318
}
282319
}
283320
return nil
284321
}
285322

286323
// 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
289394
}

0 commit comments

Comments
 (0)