golang post和get发送请求
之前使用python进行编程的时候,最常用的就是通过post和get一个URL抓取所需的数据,之前有一个短信接口使用的python实现的(post数据到某一网关URL),但由于python源码都是公开的(pyc也很容易就反编译出来),所以准备使用golang进行重写下,这样即使让其他人调用的话,也不会泄露网关的信息和调用方式 ,刚好也借此机会总结下golang下post和get数据的方法。
一、http get请求
由于get请求相对简单,这里先看下如果通过一个URL get数据:
1/*
2 Http (curl) request in golang
3 @author www.361way.com <itybku>
4*/
5package main
6import (
7 "fmt"
8 "io/ioutil"
9 "net/http"
10)
11func main() {
12 url := "https://361way.com/api/users"
13 req, _ := http.NewRequest("GET", url, nil)
14 res, _ := http.DefaultClient.Do(req)
15 defer res.Body.Close()
16 body, _ := ioutil.ReadAll(res.Body)
17 fmt.Println(string(body))
18}
19</itybku>
如需要增加http header头,只需要在req下增加对应的头信息即可,如下:
1req, _ := http.NewRequest("GET", url, nil)
2req.Header.Add("cache-control", "no-cache")
3res, _ := http.DefaultClient.Do(req)
二、http post请求
http post请求代码如下:
1/*
2 Http (curl) request in golang
3 @author www.361way.com <itybku>
4*/
5package main
6import (
7"fmt"
8"net/http"
9"io/ioutil"
10)
11func main() {
12 url := "https://reqres.in/api/users"
13 payload := strings.NewReader("name=test&jab=teacher")
14 req, _ := http.NewRequest("POST", url, payload)
15 req.Header.Add("content-type", "application/x-www-form-urlencoded")
16 req.Header.Add("cache-control", "no-cache")
17 res, _ := http.DefaultClient.Do(req)
18 defer res.Body.Close()
19 body, _ := ioutil.ReadAll(res.Body)
20 fmt.Println(string(body))
21}
22</itybku>
需要特别注意的是,上面的req.Header.Add x-www-form-urlencoded 行是关键,一定不能取消,我在post给网关数据时,刚开始一直不成功(也未报错),后来加上这一行后就成功发送信息了。
三、post bytes
上面直接post的是字符串,也可以post bytes数据给URL ,示例如下:
1package main
2import (
3 "bytes"
4 "fmt"
5 "io/ioutil"
6 "net/http"
7 "net/url"
8)
9func main() {
10 request_url := "http://localhost/index.php"
11 // 要 POST的 参数
12 form := url.Values{
13 "username": {"xiaoming"},
14 "address": {"beijing"},
15 "subject": {"Hello"},
16 "from": {"china"},
17 }
18 // func Post(url string, bodyType string, body io.Reader) (resp *Response, err error) {
19 //对form进行编码
20 body := bytes.NewBufferString(form.Encode())
21 rsp, err := http.Post(request_url, "application/x-www-form-urlencoded", body)
22 if err != nil {
23 panic(err)
24 }
25 defer rsp.Body.Close()
26 body_byte, err := ioutil.ReadAll(rsp.Body)
27 if err != nil {
28 panic(err)
29 }
30 fmt.Println(string(body_byte))
31}
同样,涉及到http头的时候,和上面一样,通过下面的方式增加:
1req, err := http.NewRequest("POST", hostURL, strings.NewReader(publicKey))
2if err != nil {
3 glog.Fatal(err)
4}
5req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
最后,推荐多看官方文档,刚开始找了不少文档一直不得要领,而官方request_test.go 文件已给了我们很好的示例。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/golang-post-get/5861.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.