golang实现http server端和http client端

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_45604257/article/details/102373043

一、http server端

1.http包提供了HTTP客户端和服务端的实现。
2.http.HandleFunc-注册回调函数

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
HandleFunc注册一个处理器函数handler和对应的模式pattern(注册到DefaultServeMux)。ServeMux的文档解释了模式的匹配机制。

3.http.ListenAndServe

func ListenAndServe(addr string, handler Handler) error
ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil,此时会使用DefaultServeMux。

服务端示例代码:

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	//注册回调函数
	http.HandleFunc("/hello", hellohello)
	log.Println("start")
	//绑定tcp监听地址,并开始接受请求,然后调用服务端处理程序来处理传入的连接请求
	//参数1为addr即监听地址;参数2表示服务端处理程序,通常为nil
	//当参数2为nil时,服务端调用http.DefaultServeMux进行处理
	err := http.ListenAndServe(":8081", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

func hellohello(w http.ResponseWriter, r *http.Request) {
	//ParseForm解析URL中的查询字符串,并将解析结果更新到r.Form字段
	r.ParseForm()
	fmt.Println(r.Form)
	//遍历打印解析结果
	for key, value := range r.Form {
		fmt.Println(key, value)

	}
	w.Write([]byte("hello"))
}

4.func hellohello(w http.ResponseWriter, r *http.Request)中,
w用来“给客户端回发数据”。它是一个interface:

type ResponseWriter interface {
     Header() 
     HeaderWrite([]byte) (int, error)
     WriteHeader(int)
 }

r 用来“接收客户端发送的数据”。浏览器发送给服务器的http请求包的内容可以借助r来查看。它对应一个结构体:

type Request struct {
    Method string		// 浏览器请求方法 GET、POST…
    URL *url.URL		// 浏览器请求的访问路径
	……
    Header Header		// 请求头部
    Body io.ReadCloser	// 请求包体
    RemoteAddr string	// 浏览器地址
    ……
    ctx context.Context
}

二、http client端

客户端访问web服务器数据,主要使用func Get(url string) (resp *Response, err error)函数来完成。读到的响应报文数据被保存在 Response 结构体中。

type Response struct {
   Status     string // e.g. "200 OK"
   StatusCode int    // e.g.  200
   Proto      string // e.g. "HTTP/1.0"
   ……
   Header Header
   Body io.ReadCloser
   ……
}

服务器发送的响应包体被保存在Body中。可以使用它提供的Read方法来获取数据内容。保存至切片缓冲区中,拼接成一个完整的字符串来查看。
结束的时候,需要调用Body中的Close()方法关闭io。

客户端示例代码

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	//使用Get方法获取服务器响应包数据
	resp, err := http.Get("http://localhost:8081/hello?name=lisa&age=24&class=1411")

	if err != nil {
		fmt.Println(err)
	}
	defer resp.Body.Close()
	// 获取服务器端读到的数据
	fmt.Println("Status = ", resp.Status)         // 状态
	fmt.Println("StatusCode = ", resp.StatusCode) // 状态码
	fmt.Println("Header = ", resp.Header)         // 响应头部
	fmt.Println("Body = ", resp.Body)             // 响应包体
	//读取body内的内容
	content, err := ioutil.ReadAll(resp.Body)

	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(content))

}

terminal:
在t里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45604257/article/details/102373043