github.com/lingyao2333/mo-zero@v1.4.1/rest/httpc/responses.go (about) 1 package httpc 2 3 import ( 4 "bytes" 5 "io" 6 "net/http" 7 "strings" 8 9 "github.com/lingyao2333/mo-zero/core/mapping" 10 "github.com/lingyao2333/mo-zero/rest/internal/encoding" 11 "github.com/lingyao2333/mo-zero/rest/internal/header" 12 ) 13 14 // Parse parses the response. 15 func Parse(resp *http.Response, val interface{}) error { 16 if err := ParseHeaders(resp, val); err != nil { 17 return err 18 } 19 20 return ParseJsonBody(resp, val) 21 } 22 23 // ParseHeaders parses the response headers. 24 func ParseHeaders(resp *http.Response, val interface{}) error { 25 return encoding.ParseHeaders(resp.Header, val) 26 } 27 28 // ParseJsonBody parses the response body, which should be in json content type. 29 func ParseJsonBody(resp *http.Response, val interface{}) error { 30 defer resp.Body.Close() 31 32 if isContentTypeJson(resp) { 33 if resp.ContentLength > 0 { 34 return mapping.UnmarshalJsonReader(resp.Body, val) 35 } 36 37 var buf bytes.Buffer 38 if _, err := io.Copy(&buf, resp.Body); err != nil { 39 return err 40 } 41 42 if buf.Len() > 0 { 43 return mapping.UnmarshalJsonReader(&buf, val) 44 } 45 } 46 47 return mapping.UnmarshalJsonMap(nil, val) 48 } 49 50 func isContentTypeJson(r *http.Response) bool { 51 return strings.Contains(r.Header.Get(header.ContentType), header.ApplicationJson) 52 }