Go语言HTTP编程详解(附带实例)
HTTP(hypertext transfer protocol)协议,即超文本传输协议,是互联网上应用最为广泛的一种网络协议,它规定了浏览器和服务器之间交互通信的规则,通过互联网传送文档的数据传送协议。HTTP 协议通常承载于 TCP 协议之上。
为了实现 HTTP 客户端,net/http 包中的 Client 类型提供如下几个函数:
下面演示如何编写简单的 HTTP 客户端。代码如下:
http.ListenAndServe() 函数的语法格式如下:
此外,net/http 包还提供 http.ListenAndServeTLS() 函数,用于处理 HTTPS 连接请求。http.ListenAndServeTLS() 函数的语法格式如下:
下面演示如何编写简单的 HTTP 服务端。代码如下:
当运行程序时,要先运行 HTTP 服务器端,再运行 UDP 客户端,在 UDP 客户端所在 VSCode 窗口的控制台上打印如下的信息:
Go语言HTTP客户端
因为 Go 语言内置的 net/http 包涵盖 HTTP 客户端的具体实现,所以 HTTP 客户端的具体实现不需要借助第三方网络通信库。为了实现 HTTP 客户端,net/http 包中的 Client 类型提供如下几个函数:
func (c *Client) Get(url string) (r *Response, err error) func (c *Client) Post(url string, bodyType string, body io.Reader) (r *Response, err error) func (c *Client) PostForm(url string, data url.Values) (r *Response, err error) func (c *Client) Head(url string) (r *Response, err error) func (c *Client) Do(req *Request) (resp *Response, err error)函数说明如下:
- Get():用于请求资源,如网址首页等;
- Post():用于发送数据;
- PostForm():用于提交标准编码格式为 application/x-www-form-urlencoded 的表单;
- Head():用于只请求资源的头部信息;
- Do():用于设定一些自定义的 HTTP Header 字段,满足 HTTP 请求中的定制信息。
下面演示如何编写简单的 HTTP 客户端。代码如下:
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { // 发送 HTTP 请求,请求一个网页 response, err := http.Get("http://localhost:3000/hello") if err != nil { fmt.Println("请求失败:", err) return } defer response.Body.Close() // 关闭请求 // 接收数据 body, _ := ioutil.ReadAll(response.Body) fmt.Println(string(body)) }
Go语言HTTP服务端
使用 net/http 包提供的 http.ListenAndServe() 函数可以监听指定地址并处理 HTTP 请求。http.ListenAndServe() 函数的语法格式如下:
func ListenAndServe(addr string, handler Handler) error参数说明如下:
- addr:监听地址;
- handler:用于处理连接请求的服务端处理程序,通常为空。
此外,net/http 包还提供 http.ListenAndServeTLS() 函数,用于处理 HTTPS 连接请求。http.ListenAndServeTLS() 函数的语法格式如下:
func ListenAndServeTLS(addr string, certFile string, keyFile string, handler Handler) error参数说明如下:
- addr:监听地址;
- certFile:对应证书文件(如 SSL 证书)存放路径;
- keyFile:对应证书私钥文件路径;
- handler:用于处理连接请求的服务端处理程序,通常为空。
下面演示如何编写简单的 HTTP 服务端。代码如下:
package main import ( "flag" "net/http" ) func main() { // 域名监听地址 host := flag.String("host", "127.0.0.1", "listen host") // 监听端口 port := flag.String("port", "3000", "listen port") flag.Parse() // 注册处理函数 http.HandleFunc("/hello", Hello) // 启动 HTTP 服务并监听指定地址 err := http.ListenAndServe(*host+":"+*port, nil) if err != nil { panic(err) } } // Hello 处理函数:向客户端返回简单文本 func Hello(w http.ResponseWriter, req *http.Request) { w.Write([]byte("你好,客户端!")) }为了保证上述程序成功运行,要打开两个 VS Code 窗口:一个窗口是 HTTP 服务器端,另一个窗口是 HTTP 客户端。
当运行程序时,要先运行 HTTP 服务器端,再运行 UDP 客户端,在 UDP 客户端所在 VSCode 窗口的控制台上打印如下的信息:
你好,客户端!
这说明 HTTP 服务器端成功处理了由 HTTP 客户端发送的 HTTP 请求。