【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并发编程实战》清华大学出版社
posted @ 2022-01-01 17:31  花酒锄作田  阅读(143)  评论(0编辑  收藏  举报