Go实现http(net包)

http协议基于Tcp/ip协议;区别在于Tcp是面向连接的,而http是短连接,一次请求对用一次回应

服务端

http的开启方式1:


func f1(w http.ResponseWriter, r *http.Request) {
	n, err := ioutil.ReadFile("./home.html")
	if err != nil {
		w.Write([]byte("页面丢失了!"))
	}
	w.Write(n)
}

//模拟客户端请求;同浏览器
func f2(w http.ResponseWriter, r *http.Request) {
	queryMap := r.URL.Query()
	fmt.Println(queryMap) //自动识别请求URl中的参数 并以map形式展示
	fmt.Println(queryMap["name"])
	fmt.Println(queryMap["age"])

	fmt.Println(r.Method)
	fmt.Println(ioutil.ReadAll(r.Body)) //在服务端打印客户端发送的请求的body
	w.Write([]byte("hello"))
}
//启动http服务的方式1
func main() {
	http.HandleFunc("/home", f1)
	http.HandleFunc("/simulation/", f2)
	http.ListenAndServe("0.0.0.0:9090", nil) //监听并服务于指定的IP和端口;
}

http的开启方式2:

type myHandleType struct{
	addr string
}

func new()*myHandleType{
	return &myHandleType{
		addr: "0.0.0.0:9090",
	}
}
//实现这个ServerHTTP这个方法从而实现http.Handler这个接口类
func (m *myHandleType)ServeHTTP(rsp http.ResponseWriter, req *http.Request){
	if req.URL.Path=="/v1" {
	    httpCode:=http.StatusOK
		text := http.StatusText(httpCode)
		fmt.Println("200",text)
		rsp.Write([]byte("hello!"))
		return
	}
}

func main(){
	w:=new()
	//http是基于tcp/Ip协议的,所以首先开启监听
	listener, err := net.Listen("tcp", w.addr)
	if err != nil {
		fmt.Println("net listen failed:",err)
		return
	}
	//启动http服务
	err = http.Serve(listener, w)
	if err != nil {
		fmt.Println("http serve failed:",err)
		return
	}
}

客户端

请求示例1:请求的query无法编译

func main() {
	//get请求示例1;对于get的提交的query值无法编译
	 resp, err := http.Get("http://127.0.0.1:9090/simulation?name=铁柱&id=123")
	 if err != nil {
		fmt.Println("get request failed err:", err)
	 	return
	 }
}

请求示例2:对请求的query进行编译

func main() {
	//get请求示例2;对get的提交的query值编译  和自定义
	var urlObj, _ = url.Parse("http://127.0.0.1:9090/simulation/")
	var urlData = url.Values{} //url  map  可以对其编码
	urlData.Set("name", "铁柱")
	urlData.Set("age", "123")
	queryStr := urlData.Encode() //编码后的url 地址
	 fmt.Println(queryStr)
	urlObj.RawQuery = queryStr
	req, err := http.NewRequest("get", urlObj.String(), nil)
	resp, err := http.DefaultClient.Do(req) //发送请求
	if err != nil {
		fmt.Println("send request failed;err:", err)
	}
	defer resp.Body.Close() //resp.Body 一定要关闭
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("read response failed err:", err)
		return
	}
	fmt.Println(string(b))
}

猜你喜欢

转载自blog.csdn.net/wzb_wzt/article/details/107752343