搭建http server

round one,我们来点简单的,搭建一个简单的http server。

目标:

  • 路由hello接收参数并获取到输出json数据
  • 自定义404
  • 处理超时页面

使用到的库:

  • net/http
  • time
  • encoding/json

我们先搭建起来server:

package main

import (
	"net/http"
)

func main()  {
	srv := http.Server{
		Addr: ":8080",
		Handler: http.HandlerFunc(defaultHttp),
	}
	srv.ListenAndServe()
}

// 默认http处理
func defaultHttp(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("wow"))
}

运行就可以跑起来了。

我们再来定义下json输出格式。

// 自定义返回
type JsonRes struct {
	Code int `json:"code"`
	Data interface{} `json:"data"`
	Msg string `json:"msg"`
	TimeStamp int64 `json:"timestmap"`
}

func apiResult(w http.ResponseWriter, code int, data interface{}, msg string) {
	body, _ := json.Marshal(JsonRes{
		Code: code, 
		Data: data, 
		Msg: msg, 
		// 获取时间戳
		TimeStamp: time.Now().Unix(),
	})
    w.Write(body)
}

再来看一下接收参数与输出:

// 处理hello,并接收参数输出json
func sayHello(w http.ResponseWriter, r *http.Request) {
    query := r.URL.Query()

    // 第一种方式,但是没有name参数会报错
    // name := query["name"][0]

    // 第二种方式
    name := query.Get("name")
	
    apiResult(w, 0, name+" say "+r.PostFormValue("some"), "success")
}

超时处理:

Handler: http.TimeoutHandler(http.HandlerFunc(defaultHttp), 2*time.Second, "Timeout!!!")

404:

http.Error(w, "you lost???", http.StatusNotFound)

最后加入路由处理:

func defaultHttp(w http.ResponseWriter, r *http.Request) {
	path, httpMethod := r.URL.Path, r.Method

	if path == "/" {
		w.Write([]byte("index"))
		return 
	}

	if path == "/hello" && httpMethod == "POST" {
		sayHello(w, r)
		return 
	}

	if path == "/sleep" {
		// 模拟一下业务处理超时
		time.Sleep(4*time.Second)
		return 
	}

	if path == "/path" {
		w.Write([]byte("path:"+path+", method:"+httpMethod))
		return 
	}

	// 自定义404
	http.Error(w, "you lost???", http.StatusNotFound)
}

我们运行起来看下效果:

img404效果

imghello

img首页

img超时

这样就完成了一个简单的http server,是不是很简单呢?


搭建http server
https://blog.puresai.com/2021/02/12/goexample1/
作者
puresai
许可协议