package q5 import ( "errors" "io/ioutil" "net/http" net_url "net/url" "strings" ) const ( HTTP_OPT_ADD_HEADER = iota HTTP_OPT_SET_PROXY = iota ) const ( HTTP_HEADER_JSON = "application/json" ) func internalSetOpt(client *http.Client, request *http.Request, opt int32, key string, val string) { switch opt { case HTTP_OPT_ADD_HEADER: request.Header.Add(key, val) default: panic("error http opt") } } func HttpGet(url string, params map[string]string) (string, error) { return HttpGetEx(url, params, nil) } func HttpGetEx(url string, params map[string]string, initFunc func(setOpt func(int32, string, string))) (string, error) { if !StrContains(url, "?") { url = url + "?" } { u := net_url.Values{} for key, val := range params { u.Set(key, val) } url = url + u.Encode() } client := &http.Client{} request, err := http.NewRequest("GET", url, nil) if err != nil { panic("http.NewRequest error") } if initFunc != nil { initFunc(func(opt int32, key string, val string) { internalSetOpt(client, request, opt, key, val) }) } if resp, err := client.Do(request); err == nil { if resp.StatusCode != 200 { return "", errors.New("HttpGet error Status:" + resp.Status) } defer resp.Body.Close() if bytes, err := ioutil.ReadAll(resp.Body); err == nil { return string(bytes), nil } else { return "", err } } else { return "", err } } func HttpGetEx2(url string, params map[string]string) (*http.Response, string, error) { if !StrContains(url, "?") { url = url + "?" } { u := net_url.Values{} for key, val := range params { u.Set(key, val) } url = url + u.Encode() } client := &http.Client{} request, err := http.NewRequest("GET", url, nil) if err != nil { panic("http.NewRequest error") } if resp, err := client.Do(request); err == nil { defer resp.Body.Close() if bytes, err := ioutil.ReadAll(resp.Body); err == nil { return resp, string(bytes), nil } else { return resp, "", err } } else { return nil, "", err } } func HttpPost(url string, params map[string]string, contentType string, body string) (string, error) { if !StrContains(url, "?") { url = url + "?" } { u := net_url.Values{} for key, val := range params { u.Set(key, val) } url = url + u.Encode() } resp, err := http.Post(url, contentType, strings.NewReader(body)) if err != nil { return "", err } defer resp.Body.Close() if bytes, err := ioutil.ReadAll(resp.Body); err == nil { return string(bytes), nil } else { return "", err } }