【Go语言学习】——HTTP客户端和服务端

HTTP客户端和服务端


参考博客

HTTP客户端就是浏览器,而服务端就是后台服务器

HTTP协议规定了浏览器和网站服务器之间通信的规则,HTML通过标签符号为页面增添元素,CSS就是为了形成不同的颜色样式来渲染页面,JS是一种在浏览器上执行的编程语言,定义了页面上的动作。

package main

// http server

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

// Request中包含了客户端请求的所有内容,Response则是返回给客户端的内容
func f1(w http.ResponseWriter, r *http.Request) {
	b, err := ioutil.ReadFile("./xx.html")
	if err != nil {
		w.Write([]byte("发生错误:" + fmt.Sprintf("%v", err)))
	}
	w.Write(b)
}

func f2(w http.ResponseWriter, r *http.Request) {
	// 读取客户端发来的请求信息
	// 对于GET请求,参数都放在URL上,请求body里是没有数据的
	fmt.Println(r.URL)
	// 自动识别URL中的参数
	fmt.Println(r.URL.Query())
	queryParam := r.URL.Query()
	name := queryParam.Get("name")
	age := queryParam.Get("age")
	fmt.Println(name, age)
	fmt.Println(r.Method)
	fmt.Println(ioutil.ReadAll(r.Body))
	w.Write([]byte("ok"))
}

func main() {
	// 访问这个路径就执行f1函数
	http.HandleFunc("/hello", f1)
	http.HandleFunc("/xxx", f2)
	http.ListenAndServe("127.0.0.1:9090", nil)
}

package main

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

// http Client

func main() {
	// 直接通过地址请求数据
	// resp, err := http.Get("http://127.0.0.1:9090/xxx?name=kaka&age=18")
	// if err != nil {
	// 	fmt.Printf("get url failed,err:%v\n", err)
	// 	return
	// }
	// 通过编码转义,多用于将中文编码,自定义其中的参数然后来发起请求
	data := url.Values{} //本质还是map
	urlObj, _ := url.Parse("http://127.0.0.1:9090/xxx")
	data.Set("name", "卡卡")
	data.Set("age", "18")
	queryStr := data.Encode() //URL Encode之后的URL
	urlObj.RawQuery = queryStr
	fmt.Println(queryStr)
	// 建立请求
	req, _ := http.NewRequest("GET", urlObj.String(), nil)
	// 执行请求并获得回复
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		fmt.Printf("get url failed,err:%v\n", err)
		return
	}
	// 等价于下方代码
	// resp, err := http.Get(urlObj.String())
	// if err != nil {
	// 	fmt.Printf("get url failed,err:%v\n", err)
	// }
	// response一定要记得关闭

	// 当请求并不是很频繁时,希望用完就关闭链接,可以建立短连接减少资源消耗
	// tr := &http.Transport{
	// 	DisableKeepAlives: true,
	// }
	// client := http.Client{
	// 	Transport: tr,
	// }
	// resp, err := client.Do(req)
	// if err != nil {
	// 	fmt.Printf("get url failed,err:%v\n", err)
	// 	return
	// }

	defer resp.Body.Close()
	// 从resp中将服务端返回的body数据读出来
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("read resp.Body failed,err:%v\n", err)
		return
	}
	fmt.Println(string(b))
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值