golang几种post请求方式

2019年1月28日 发表评论 阅读评论

golang的net/http包既可以实现http server服务,也可以通过该包向http服务器发送post或get等模式的请求。上次总结过一篇 golang post和get发送请求  ,本篇基于上一篇做一些更细节场景的总结。

一、直接get请求

get请求可以直接http.Get方法,非常简单。

func httpGet() {
    resp, err := http.Get("http://www.361way.com/demo/accept.php?id=1")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }
    fmt.Println(string(body))
}

二、直接post请求

方法1:

使用http.Post方式。使用这个方法的话,第二个参数要设置成”application/x-www-form-urlencoded”,否则post参数无法传递:

func httpPost() {
    resp, err := http.Post("http://www.361way.com/demo/accept.php",
        "application/x-www-form-urlencoded",
        strings.NewReader("name=cjb"))
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }
    fmt.Println(string(body))
}

方法2:

也可以使用http.PostForm方法:

func httpPostForm() {
    resp, err := http.PostForm("http://www.361way.com/demo/accept.php",
        url.Values{"key": {"Value"}, "id": {"123"}})
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }
    fmt.Println(string(body))
}

三、增加请求头信息

有时需要在请求的时候设置头参数、cookie之类的数据,就可以使用http.Do方法。

func httpDo() {
    client := &http.Client{}
    req, err := http.NewRequest("POST", "http://www.361way.com/demo/accept.php", strings.NewReader("name=cjb"))
    if err != nil {
        // handle error
    }
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    req.Header.Set("Cookie", "name=anny")
    resp, err := client.Do(req)
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        // handle error
    }
    fmt.Println(string(body))
}

同上面的post请求,必须要设定Content-Type为application/x-www-form-urlencoded,post参数才可正常传递。而对于比较简单的发起head请求可以直接使用http client的head方法。

四、根据http请求的类型

1.普通的post\get请求

var r http.Request
    r.ParseForm()
    r.Form.Add("uuid", orderUUID)
    bodystr := strings.TrimSpace(r.Form.Encode())
    request, err := http.NewRequest("GET", url, strings.NewReader(bodystr))
    if err != nil {
       //TODO:
    }
    request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    request.Header.Set("Connection", "Keep-Alive")
    var resp *http.Response
    resp, err = http.DefaultClient.Do(request)
    if err != nil {
    //TODO:
    }

2、body全部二进制数据流进行post

//body提交二进制数据
func DoBytesPost(url string, data []byte) ([]byte, error) {
    body := bytes.NewReader(data)
    request, err := http.NewRequest(POST_METHOD, url, body)
    if err != nil {
        log.Println("http.NewRequest,[err=%s][url=%s]", err, url)
        return []byte(""), err
    }
    request.Header.Set("Connection", "Keep-Alive")
    var resp *http.Response
    resp, err = http.DefaultClient.Do(request)
    if err != nil {
        log.Println("http.Do failed,[err=%s][url=%s]", err, url)
        return []byte(""), err
    }
    defer resp.Body.Close()
    b, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Println("http.Do failed,[err=%s][url=%s]", err, url)
    }
    return b, err
}

3、模拟web表单文件上传进行post

func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, error) {
    file, err := os.Open(path)
    if err != nil {
        return nil, err
    }
    defer file.Close()
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)
    part, err := writer.CreateFormFile(paramName, path)
    if err != nil {
        return nil, err
    }
    _, err = io.Copy(part, file)
    for key, val := range params {
        _ = writer.WriteField(key, val)
    }
    err = writer.Close()
    if err != nil {
        return nil, err
    }
    request, err := http.NewRequest("POST", uri, body)
    request.Header.Set("Content-Type", writer.FormDataContentType())
    return request, err
}




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.