-
Notifications
You must be signed in to change notification settings - Fork 0
/
request.go
419 lines (373 loc) · 12.5 KB
/
request.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
package finding
import (
"encoding/xml"
"fmt"
)
// AdvancedRequest searches for items on eBay by category or keyword or both.
type AdvancedRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services findItemsAdvancedRequest" json:"-"`
RequestCategories
RequestKeywords
RequestDescriptionSearch
RequestAspectFilter
RequestItemFilter
RequestOutputSelector
RequestStandard
}
// GetPage executes AdvancedRequest for page #
// Valid pages # 1 - 100
func (sr *AdvancedRequest) GetPage(page int) (AdvancedResponse, error) {
if page < 1 {
page = 1
}
sr.WithPageNumber(page)
body, err := sr.getBody()
if err != nil {
return AdvancedResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return AdvancedResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return AdvancedResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
ar := AdvancedResponse{}
err = xml.Unmarshal(res.Body(), &ar)
if err != nil {
return AdvancedResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return ar, nil
}
// Execute executes AdvancedRequest for the first page
func (sr *AdvancedRequest) Execute() (AdvancedResponse, error) {
return sr.GetPage(1)
}
// GetBody return AdvancedRequest body as XML
func (sr *AdvancedRequest) GetBody() ([]byte, error) {
sr.prepare()
return xml.MarshalIndent(sr, "", " ")
}
func (sr *AdvancedRequest) getBody() ([]byte, error) {
sr.prepare()
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// ByCategoryRequest searches for items on eBay using specific eBay category ID numbers
// (input category ID numbers using categoryId).
type ByCategoryRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services findItemsByCategoryRequest" json:"-"`
RequestCategories
RequestAspectFilter
RequestItemFilter
RequestOutputSelector
RequestStandard
}
// GetPage executes ByCategoryRequest for page #
// Valid pages # 1 - 100
func (sr *ByCategoryRequest) GetPage(page int) (ByCategoryResponse, error) {
if page < 1 {
page = 1
}
sr.WithPageNumber(page)
body, err := sr.getBody()
if err != nil {
return ByCategoryResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return ByCategoryResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return ByCategoryResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
bcr := ByCategoryResponse{}
err = xml.Unmarshal(res.Body(), &bcr)
if err != nil {
return ByCategoryResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return bcr, nil
}
// Execute executes ByCategoryRequest for the first page
func (sr *ByCategoryRequest) Execute() (ByCategoryResponse, error) {
return sr.GetPage(1)
}
// GetBody return ByCategoryRequest body as XML
func (sr *ByCategoryRequest) GetBody() ([]byte, error) {
sr.prepare()
return xml.MarshalIndent(sr, "", " ")
}
func (sr *ByCategoryRequest) getBody() ([]byte, error) {
sr.prepare()
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// ByKeywordsRequest searches for items on eBay by a keyword query (keywords).
type ByKeywordsRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services findItemsByKeywordsRequest" json:"-"`
RequestKeywords
RequestDescriptionSearch
RequestAspectFilter
RequestItemFilter
RequestOutputSelector
RequestStandard
}
// GetPage executes ByKeywordsRequest for page #
// Valid pages # 1 - 100
func (sr *ByKeywordsRequest) GetPage(page int) (ByKeywordsResponse, error) {
if page < 1 {
page = 1
}
sr.WithPageNumber(page)
body, err := sr.getBody()
if err != nil {
return ByKeywordsResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return ByKeywordsResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return ByKeywordsResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
bkr := ByKeywordsResponse{}
err = xml.Unmarshal(res.Body(), &bkr)
if err != nil {
return ByKeywordsResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return bkr, nil
}
// Execute executes ByKeywordsRequest for the first page
func (sr *ByKeywordsRequest) Execute() (ByKeywordsResponse, error) {
return sr.GetPage(1)
}
// GetBody return ByKeywordsRequest body as XML
func (sr *ByKeywordsRequest) GetBody() ([]byte, error) {
sr.prepare()
return xml.MarshalIndent(sr, "", " ")
}
func (sr *ByKeywordsRequest) getBody() ([]byte, error) {
sr.prepare()
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// ByProductRequest searches for items on eBay using specific eBay product values.
type ByProductRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services findItemsByProductRequest" json:"-"`
RequestProduct
RequestItemFilter
RequestOutputSelector
RequestStandard
}
// GetPage executes ByProductRequest for page #
// Valid pages # 1 - 100
func (sr *ByProductRequest) GetPage(page int) (ByProductResponse, error) {
if page < 1 {
page = 1
}
sr.WithPageNumber(page)
body, err := sr.getBody()
if err != nil {
return ByProductResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return ByProductResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return ByProductResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
bpr := ByProductResponse{}
err = xml.Unmarshal(res.Body(), &bpr)
if err != nil {
return ByProductResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return bpr, nil
}
// Execute executes ByProductRequest for the first page
func (sr *ByProductRequest) Execute() (ByProductResponse, error) {
return sr.GetPage(1)
}
// GetBody return ByProductRequest body as XML
func (sr *ByProductRequest) GetBody() ([]byte, error) {
sr.prepare()
return xml.MarshalIndent(sr, "", " ")
}
func (sr *ByProductRequest) getBody() ([]byte, error) {
sr.prepare()
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// InEbayStoresRequest searches for items in the eBay store inventories.
// You can combine storeName with keywords to find specific items,
// or use keywords without storeName to search for items in all eBay stores.
type InEbayStoresRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services findItemsIneBayStoresRequest" json:"-"`
StoreName string `json:"storeName,omitempty" xml:"storeName,omitempty"`
RequestAspectFilter
RequestCategories
RequestKeywords
RequestItemFilter
RequestOutputSelector
RequestStandard
}
// WithStoreName adds store's name to InEbayStoresRequest
func (sr *InEbayStoresRequest) WithStoreName(name string) *InEbayStoresRequest {
sr.StoreName = name
return sr
}
// GetPage executes InEbayStoresRequest for page #
// Valid pages # 1 - 100
func (sr *InEbayStoresRequest) GetPage(page int) (InEbayStoresResponse, error) {
if page < 1 {
page = 1
}
sr.WithPageNumber(page)
body, err := sr.getBody()
if err != nil {
return InEbayStoresResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return InEbayStoresResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return InEbayStoresResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
iesr := InEbayStoresResponse{}
err = xml.Unmarshal(res.Body(), &iesr)
if err != nil {
return InEbayStoresResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return iesr, nil
}
// Execute executes InEbayStoresRequest for the first page
func (sr *InEbayStoresRequest) Execute() (InEbayStoresResponse, error) {
return sr.GetPage(1)
}
// GetBody return InEbayStoresRequest body as XML
func (sr *InEbayStoresRequest) GetBody() ([]byte, error) {
sr.prepare()
return xml.MarshalIndent(sr, "", " ")
}
func (sr *InEbayStoresRequest) getBody() ([]byte, error) {
sr.prepare()
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// GetHistogramsRequest retrieves category and/or aspect
// histogram information for the eBay category you specify using the categoryId field.
type GetHistogramsRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services getHistogramsRequest" json:"-"`
CategoryId string `json:"categoryId" xml:"categoryId"`
RequestBasic
}
// WithCategory adds categoryId to GetHistogramsRequest
func (sr *GetHistogramsRequest) WithCategory(category string) *GetHistogramsRequest {
sr.CategoryId = category
return sr
}
// Execute executes GetHistogramsRequest
func (sr *GetHistogramsRequest) Execute() (GetHistogramsResponse, error) {
body, err := sr.getBody()
if err != nil {
return GetHistogramsResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return GetHistogramsResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return GetHistogramsResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
ghr := GetHistogramsResponse{}
err = xml.Unmarshal(res.Body(), &ghr)
if err != nil {
return GetHistogramsResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return ghr, nil
}
// GetBody return GetHistogramsRequest body as XML
func (sr *GetHistogramsRequest) GetBody() ([]byte, error) {
return xml.MarshalIndent(sr, "", " ")
}
func (sr *GetHistogramsRequest) getBody() ([]byte, error) {
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// GetKeywordsRecommendationRequest retrieves commonly used words found in eBay titles,
// based on the words you supply to the call.
type GetKeywordsRecommendationRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services getSearchKeywordsRecommendationRequest" json:"-"`
RequestKeywords
RequestBasic
}
// Execute executes GetKeywordsRecommendationRequest
func (sr *GetKeywordsRecommendationRequest) Execute() (GetKeywordsRecommendationResponse, error) {
body, err := sr.getBody()
if err != nil {
return GetKeywordsRecommendationResponse{}, fmt.Errorf("unable to serialize req body: %w", err)
}
res, err := sr.Client.R().SetBody(body).Post(sr.URL)
if err != nil {
return GetKeywordsRecommendationResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return GetKeywordsRecommendationResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
gkrr := GetKeywordsRecommendationResponse{}
err = xml.Unmarshal(res.Body(), &gkrr)
if err != nil {
return GetKeywordsRecommendationResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return gkrr, nil
}
// GetBody return GetKeywordsRecommendationRequest body as XML
func (sr *GetKeywordsRecommendationRequest) GetBody() ([]byte, error) {
return xml.MarshalIndent(sr, "", " ")
}
func (sr *GetKeywordsRecommendationRequest) getBody() ([]byte, error) {
return xml.Marshal(sr)
}
/*
==============================================================================
*/
// GetVersionRequest returns the current version of the service.
// This simple call can be used to monitor the service for availability.
// This call has no input parameters and the response contains only the standard output fields.
type GetVersionRequest struct {
XMLName xml.Name `xml:"http://www.ebay.com/marketplace/search/v1/services getVersionRequest" json:"-"`
RequestBasic
}
// Execute executes GetVersionRequest
func (sr *GetVersionRequest) Execute() (GetVersionResponse, error) {
res, err := sr.Client.R().Post(sr.URL)
if err != nil {
return GetVersionResponse{}, fmt.Errorf("sending req: %w", err)
}
if res.StatusCode() != 200 {
return GetVersionResponse{}, fmt.Errorf("status code %d: %s", res.StatusCode(), res.String())
}
gvr := GetVersionResponse{}
err = xml.Unmarshal(res.Body(), &gvr)
if err != nil {
return GetVersionResponse{}, fmt.Errorf("parsing response body: %w", err)
}
return gvr, nil
}
// GetBody return GetVersionRequest body as XML
func (sr *GetVersionRequest) GetBody() ([]byte, error) {
return xml.MarshalIndent(sr, "", " ")
}