【go笔记】简单的http服务
前言
Go语言通过内置的标准库net/http
可以非常方便地实现web服务。不借助任何框架,单凭标准库,50行代码内即可实现简单的web服务。
http的ListenAndServe()
函数原型:
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
ListenAndServe()
函数用于在特定的TCP网络地址addr
上监听,然后调用服务端处理程序handler
来处理传入的接入请求。handler
通常为nil
,这意味着服务端调用默认的DefaultServeMux
。默认的DefaultServeMux
会自动注册用户定义的客户端逻辑处理程序。比如http.HandleFunc
示例代码:server.go
package main
import (
"fmt"
"net/http"
)
func MyHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
// 通过 r.URL.Query()获取客户端请求的Query参数
vars := r.URL.Query()
// 获取Query键为key的参数值
key, ok := vars["key"]
// 如果获取到,打印 hello get ...
if ok {
msg := "hello get " + key[0]
// w.Write() 将数据返回给客户端
// 因为 msg 是字符串类型,因此需要强制进行类型转换
w.Write([]byte(msg))
} else {
// 如果没获取到,则打印 hello world
w.Write([]byte("hello world!"))
}
}
if r.Method == "POST" {
r.ParseForm()
key := r.Form.Get("name")
msg := "hello post " + key
w.Write([]byte(msg))
}
}
func main() {
// 路由请求处理函数
http.HandleFunc("/", MyHandler)
// 在0.0.0.0:8000监听请求
// 第二个参数nil意味着服务端调用默认的DefaultServeMux处理客户端请求
err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println(err)
}
}
示例代码:client.go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"strings"
)
func httpGet() {
resp, err := http.Get("http://127.0.0.1:8000?key=python")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
func httpPost() {
resp, err := http.Post("http://127.0.0.1:8000", "application/x-www-form-urlencoded", strings.NewReader("name=Go"))
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
func main() {
httpGet()
httpPost()
}
其它
- http/2:所有数据以二进制形式传输,支持多路复用、服务器推送和Header信息压缩
参考文档
- 汪明 - 《Go并发编程实战》清华大学出版社
本文来自博客园,作者:花酒锄作田,转载请注明原文链接:https://www.cnblogs.com/XY-Heruo/p/15755726.html