先写一个可以接收post请求的服务器:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/postpage", func(w http.ResponseWriter, r *http.Request) {
//接受post请求,然后打印表单中key和value字段的值
if r.Method == "POST" {
var (
key string = r.PostFormValue("key")
value string = r.PostFormValue("value")
)
fmt.Printf("key is : %s\n", key)
fmt.Printf("value is: %s\n", value)
}
})
err := http.ListenAndServe(":80", nil)
if err != nil {
fmt.Println(err.Error())
return
}
}
然后我们使用net/http包来发送post请求:
package main
import (
"fmt"
"net/http"
"net/url"
)
func main() {
//这里添加post的body内容
data := make(url.Values)
data["key"] = []string{"this is key"}
data["value"] = []string{"this is value"}
//把post表单发送给目标服务器
res, err := http.PostForm("http://127.0.0.1/postpage", data)
if err != nil {
fmt.Println(err.Error())
return
}
defer res.Body.Close()
fmt.Println("post send success")
}
如果你不想用现成的包,那么下面这段代码就是直接通过HTTP协议实现post请求,运行效果和上面这段代码一样:
package main
import (
"fmt"
"net"
)
func main() {
//因为post方法属于HTTP协议,HTTP协议以TCP为基础,所以先建立一个
//TCP连接,通过这个TCP连接来发送我们的post请求
conn, err := net.Dial("tcp", "127.0.0.1:80")
if err != nil {
fmt.Println(err.Error())
return
}
defer conn.Close()
//构造post请求
var post string
post += "POST /postpage HTTP/1.1\r\n"
post += "Content-Type: application/x-www-form-urlencoded\r\n"
post += "Content-Length: 37\r\n"
post += "Connection: keep-alive\r\n"
post += "Accept-Language: zh-CN,zh;q=0.8,en;q=0.6\r\n"
post += "\r\n"
post += "key=this is key&value=this is value\r\n"
if _, err := conn.Write([]byte(post)); err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("post send success.")
}
如果转载请注明出处:http://blog.csdn.net/gophers/article/details/22870185