-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresponse.go
More file actions
141 lines (122 loc) · 3.03 KB
/
Copy pathresponse.go
File metadata and controls
141 lines (122 loc) · 3.03 KB
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
package httpc
import (
"encoding/gob"
"encoding/xml"
"errors"
"fmt"
"io"
"net/http"
"github.com/go-json-experiment/json"
"github.com/WJQSERVER-STUDIO/go-utils/iox"
)
// --- 响应处理方法 (使用 RequestBuilder 重构) ---
// DecodeJSON 解析 JSON 响应
func (rb *RequestBuilder) DecodeJSON(v any) error {
resp, err := rb.Execute()
if err != nil {
return err
}
defer func() {
if resp != nil {
resp.Body.Close()
}
}()
err = rb.client.decodeJSONResponse(resp, v)
if err != nil {
return err
}
return nil
}
// DecodeXML 解析 XML 响应
func (rb *RequestBuilder) DecodeXML(v any) error {
resp, err := rb.Execute()
if err != nil {
return err
}
defer resp.Body.Close()
return rb.client.decodeXMLResponse(resp, v)
}
// DecodeGOB 解析 GOB 响应
func (rb *RequestBuilder) DecodeGOB(v any) error {
resp, err := rb.Execute()
if err != nil {
return err
}
defer resp.Body.Close()
return rb.client.decodeGOBResponse(resp, v)
}
// Text 获取 Text 响应
func (rb *RequestBuilder) Text() (string, error) {
resp, err := rb.Execute()
if err != nil {
return "", err
}
defer resp.Body.Close()
return rb.client.decodeTextResponse(resp)
}
// Bytes 获取 Bytes 响应
func (rb *RequestBuilder) Bytes() ([]byte, error) {
resp, err := rb.Execute()
if err != nil {
return nil, err
}
defer resp.Body.Close()
return rb.client.decodeBytesResponse(resp)
}
// decodeJSONResponse 内部 JSON 响应解码
func (c *Client) decodeJSONResponse(resp *http.Response, obj any) error {
if resp.StatusCode >= 400 {
return c.errorResponse(resp)
}
/*
if err := json.NewDecoder(resp.Body).Decode(v); err != nil {
return fmt.Errorf("%w: %v", ErrDecodeResponse, err)
}
*/
err := json.UnmarshalRead(resp.Body, obj)
if err != nil {
return fmt.Errorf("%w: %v", ErrDecodeResponse, err)
}
return nil
}
func (c *Client) decodeXMLResponse(resp *http.Response, v any) error {
if resp.StatusCode >= 400 {
return c.errorResponse(resp)
}
if err := xml.NewDecoder(resp.Body).Decode(v); err != nil {
return fmt.Errorf("%w: %v", ErrDecodeResponse, err)
}
return nil
}
func (c *Client) decodeGOBResponse(resp *http.Response, v any) error {
if resp.StatusCode >= 400 {
return c.errorResponse(resp)
}
if err := gob.NewDecoder(resp.Body).Decode(v); err != nil {
if errors.Is(err, io.EOF) && v != nil {
return fmt.Errorf("%w: unexpected end of data: %v", ErrDecodeResponse, err)
}
return fmt.Errorf("%w: %v", ErrDecodeResponse, err)
}
return nil
}
func (c *Client) decodeTextResponse(resp *http.Response) (string, error) {
if resp.StatusCode >= 400 {
return "", c.errorResponse(resp)
}
bodyBytes, err := iox.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("%w: %s", err, ErrDecodeResponse)
}
return string(bodyBytes), nil
}
func (c *Client) decodeBytesResponse(resp *http.Response) ([]byte, error) {
if resp.StatusCode >= 400 {
return nil, c.errorResponse(resp)
}
bodyBytes, err := iox.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("%w: %s", err, ErrDecodeResponse)
}
return bodyBytes, nil
}