post 请求
// 网络客户端
type NetClient interface {
Post(url string, req, resp interface{}, header map[string]string) error
}
func generateUuid() string {
u := uuid.NewV4().String()
return u
}
type native struct {
c *http.Client
}
func setHeaders(h http.Header, kv map[string]string) {
h.Set("Content-Type", "application/json")
h.Set("Access-token", "service")
h.Set("Trace-Id", generateUuid())
for key, value := range kv {
h.Set(key, value)
}
}
func (n *native) rawPost(url string, data []byte, header map[string]string) (code int, body []byte, err error) {
var resp *http.Response
reader := bytes.NewReader(data)
req, err := http.NewRequest("POST", url, reader)
if err != nil {
return
}
// 设置请求头
setHeaders(req.Header, header)
resp, err = n.c.Do(req)
if resp != nil {
defer resp.Body.Close()
}
if err != nil {
return
}
code = resp.StatusCode
body, err = ioutil.ReadAll(resp.Body)
return
}
func (n *native) Post(url string, req, resp interface{}, header map[string]string) (err error) {
var reqBytes []byte
if reqBytes, err = json.Marshal(req); err != nil {
return err
}
var (
code int
body []byte
)
if code, body, err = n.rawPost(url, reqBytes, header); err != nil {
return err
}
if code != http.StatusOK {
return fmt.Errorf("http response status code !=200,code:%d", code)
}
return json.Unmarshal(body, resp)
}