017.网络编程

目录

1.初识网络编程

2.通过代码手动访问接口

3.访问后端接口并携带参数

4.post请求

5.响应数据给前端


1.初识网络编程

网络编程:本质上就是对服务的请求和相应进行处理


func main() {
	//定义一个接口:http.HandleFunc(请求地址,具体的业务逻辑)
	http.HandleFunc("/hello", hello)
	//设置访问地址:开启监听的代码要放在main函数的最后一行
	http.ListenAndServe("127.0.0.1:8080", nil)
}
func hello(res http.ResponseWriter, req *http.Request) {
	fmt.Println("已收到来自浏览器的请求,地址:", req.URL, ",请求方式:", req.Method)
	res.Write([]byte("第一个go语言网络程序"))
}

2.通过代码手动访问接口

/*
不使用浏览器/ApiPost/postman,通过代码手动访问接口
*/
func main() {
	//Get请求
	resp, err := http.Get("http://localhost:8080/hello")
	//关闭资源
	defer resp.Body.Close()
	if err != nil {
		fmt.Println("访问失败")
		return
	}
	fmt.Println(resp.Header)
	fmt.Println(resp.Body)
	fmt.Println(resp.Status)
	//接收具体的相应内容
	buf := make([]byte, 1024)
	for {
		len, err2 := resp.Body.Read(buf)
		if err2 != nil && err2 != io.EOF {
			fmt.Println("读取出现错误")
			return
		} else {
			resData := string(buf[:len])
			fmt.Println("服务端返回的数据为:", resData)
			break
		}
	}
}

3.访问后端接口并携带参数

/*
服务端接口
*/
func main() {
	//定义一个接口:http.HandleFunc(请求地址,具体的业务逻辑)
	http.HandleFunc("/login", login)
	//设置访问地址
	http.ListenAndServe("127.0.0.1:8080", nil)
}
func login(resp http.ResponseWriter, req *http.Request) {
	fmt.Println("接收到了前端的请求")
	//模拟数据库数据
	dataBaseUsername := "admin"
	dataBasePassword := "123456"
	//获取请求中携带的参数
	queryData := req.URL.Query()
	username := queryData.Get("username")
	password := queryData.Get("password")
	//判断是否登录成功
	if username == dataBaseUsername && password == dataBasePassword {
		resp.Write([]byte("登录成功"))
		return
	}
	resp.Write([]byte("用户名或密码错误"))
}
/*
客户端接口
*/
func main() {
	urlAddr := "http://localhost:8080/login"
	//封装参数
	data := url.Values{}
	data.Set("username", "admin")
	data.Set("password", "123456")
	//将url字符串转化为url对象,并携带数据
	urlObject, err := url.ParseRequestURI(urlAddr)
	if err != nil {
		fmt.Println("地址拼接错误")
		return
	}
	urlObject.RawQuery = data.Encode()
	//http://localhost:8080/login?password=123456&username=zhangsan
	fmt.Println(urlObject)

	//发送请求
	resp, err2 := http.Get(urlObject.String())
	defer resp.Body.Close()
	if err2 != nil {
		fmt.Println("请求失败")
		return
	}
	//读取服务端响应信息
	buf, err3 := io.ReadAll(resp.Body)
	if err3 != nil {
		fmt.Println("数据读取失败")
		return
	}
	fmt.Println(string(buf))
}

4.post请求

<!--前端发起请求-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<form action="http://localhost:8080/register" method="post">
    <h2>用户注册</h2>
    <p>用户名:<input type="text" name="username"></p>
    <p>密码: <input type="password" name="password"></p>
    <input type="submit" value="注册" >
</form>
</body>
</html>

/*
服务端接口
*/
func main() {
	//定义一个接口:http.HandleFunc(请求地址,具体的业务逻辑)
	http.HandleFunc("/register", register)
	//设置访问地址
	http.ListenAndServe("127.0.0.1:8080", nil)
}
func register(resp http.ResponseWriter, req *http.Request) {
	fmt.Println("接收到了前端的请求")
	//解析表单
	req.ParseForm()
	//获取表单中的参数
	username := req.PostForm.Get("username")
	password := req.PostForm.Get("password")
	fmt.Println(username)
	fmt.Println(password)
	resp.Write([]byte("注册成功"))
}

5.响应数据给前端

//服务端代码
type User struct {
	Name string
	Age  int
}

func main() {
	//定义一个接口:http.HandleFunc(请求地址,具体的业务逻辑)
	http.HandleFunc("/findAll", findAll)
	//设置访问地址
	http.ListenAndServe("127.0.0.1:8080", nil)
}
func findAll(resp http.ResponseWriter, req *http.Request) {
	fmt.Println("接收到了前端的请求")
	//模拟查询全部用户
	userMap := make(map[int]User)
	userMap[1] = User{"张三", 23}
	userMap[2] = User{"李四", 24}
	//返回给前端页面
	temp, err := template.ParseFiles("./day017/userlist.html")
	if err != nil {
		fmt.Println("数据返回异常")
		return
	}
	result := make(map[string](map[int]User))
	result["data"] = userMap
	temp.Execute(resp, result)
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查询用户</title>
</head>
<body>
<!--获取后端数据-->
<!--{{.data}}-->
<!--遍历-->
{{range $k,$v:=.data}}
    {{$v}}<!--整个对象-->
    {{.Name}}
    {{.Age}}
{{end}}
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值