前言
Go语言内置的net/http包非常优秀,提供了HTTP的Client和Server实现。
ListenAndServe函数使用指定的监听地址和处理器去启动一个HTTP服务端。处理器的参数通常是nil,表示采用默认的包变量DefaultServeMux作为处理器。
HandleFunc函数可以向DefaultServeMux添加处理器(即绑定api和对应的处理函数)。
实例
下面就以一个简单的实例去介绍如何使用Go搭建HTTP的服务端。
package main
import (
. "fmt"
"html"
"net/http"
"time"
)
var count int = 1
func Task(w http.ResponseWriter, r *http.Request) {
Printf(" ------ here is Task[%d] ------- \n", count)
defer r.Body.Close()
// 模拟延时
time.Sleep(time.Second * 2)
Fprintf(w, "Response.No.%d: Your request is %q\n\n", count, html.EscapeString(r.URL.Path))
count++
answer := `{"status:":"OK"}`
w.Write([]byte(answer))
}
func Task1(w http.ResponseWriter, r *http.Request) {
Printf(" ------ here is Task1[%d] ------- \n", count)
defer r.Body.Close()
// 模拟延时
time.Sleep(time.Second * 2)
Fprintf(w, "Response.No[%d]: Your request is %q\n\n", count, html.EscapeString(r.URL.Path))
count++
answer := `{"status:":"OK"}`
w.Write([]byte(answer))
}
func main() {
Println("===== This is http server =====")
http.HandleFunc("/hello/world", Task)
http.HandleFunc("/hello/world1", Task1)
err := http.ListenAndServe("127.0.0.1:8090", nil)
if err != nil {
Println("ListenAndServe error! err is ", err.Error())
}
}
解说
// 当访问 http://127.0.0.1:8090/hello/world 接口时,调用Task这个函数
http.HandleFunc("/hello/world", Task)
// 设置服务端的监听地址(ip+port),并采用默认的处理器
http.ListenAndServe("127.0.0.1:8090", nil)
// 响应请求,可分别通过以下两种方式
// 实际上Fprintf方式最终也是写到了http.ResponseWriter的io中,相当于对其做了一层封装
Fprintf(w, "Response.No.%d: Your request is %q\n\n", count, html.EscapeString(r.URL.Path))
//or
answer := `{"status:":"OK"}`
w.Write([]byte(answer))
测试
启动服务,下面在网页访问api测试是否可用。
(1)测试 http://127.0.0.1:8090/hello/world
(2)测试 http://127.0.0.1:8090/hello/world1
(3)测试 http://127.0.0.1:8090/hello/world2
(可以发现这是一个未注册的api,会提示404)
后言
这里介绍了如何搭建HTTP服务的Server端,前面我们也介绍了如何搭建HTTP服务的Client端(点击这里跳转)。
那么如何搭建 Server - Client 这样的一体化HTTP服务呢?怎么实现访问api时通过传入不同的参数进行请求,响应得到不同的内容呢?点击这里开始学习吧!