2.1 用Go写出http请求响应流

(其实这才是寒假写的第一篇博客,整理博客体系的宏图伟业鸽了这么久,太下头了)

在我们基本弄懂了Go的语法规则后,我们就可以进入到gin框架的学习了——

慢着,在真正走进gin的世界之前,让我们先来试着用go来做一个简易的http交互

了解http协议的话都知道:http是以请求(request)和响应(response)为主体的,一个请求对应一个响应。而在后端服务器方,后端代码就是收到前端传过来的request,然后给出相应的response。这个response有很多种形式,有可能是返回一些数据库中的数据,可能是返回二次处理后的数据,也有可能仅仅返回一个”操作成功“(背后藏着对数据库操作的行为)。

相比于java而言,go在这方面做得更加简洁。如果java不用框架,用servlet,则需要很繁琐的收参出参方式和冗长、让人摸不着头脑的变量方法名。

如果用框架,以springboot为例,就更不必提了,三层一个接口是基本操作:

2.1 用Go写出http请求响应流_第1张图片

 但是go则不用,短短几行代码,就可以写出一个立刻能看到效果的后端:

2.1 用Go写出http请求响应流_第2张图片

 我们让main函数运行,就可以在终端中看到如下信息:

2.1 用Go写出http请求响应流_第3张图片

光标闪烁代表着它正在监听8080端口,这个时候我们在浏览器中输入”127.0.0.1:8080/hello",即可得到以下页面:

2.1 用Go写出http请求响应流_第4张图片

并且,我们关掉后端服务器的服务,也就是停止监听8080端口后,该网页也就变成了这样:

2.1 用Go写出http请求响应流_第5张图片

验证了我们后端服务器是真的在起作用。

那为何在java环境中大费周章才能实现的网页显示,在go中如此轻松呢,接下来我们就对这几行代码进行简单解析:

 

注意这里如果是别的package,例如package awesomeProject,那代表着它不能作为单独的文件进行运行,强制运行该文件会报以下错误:

接下来是包的引入:

2.1 用Go写出http请求响应流_第6张图片

这里引入的包或模块,和java和python的引入方式差不多,只不过这里需要引入的包比java简洁太多了。

2.1 用Go写出http请求响应流_第7张图片 这里是业务函数,接收两个参数:一个是请求接收指针,指向前端传给我们的请求;另一个是响应写对象,这里向这个对象中写什么,就会出现怎样的文字,所以我们刚才看到的是"Hello World!"

2.1 用Go写出http请求响应流_第8张图片

接下来是main函数主体:HandleFunc用来定义,怎样的url输入会调用哪一个函数,这里定义了"/hello"接口会唤起sayHello方法。

光有这一行是不行的,因为我们的服务器不是跑一遍就结束的,而是要一直等待客户端的请求,故下一个方法ListenAndServe就定义了监听的端口,并且将错误信息包装成err(若正常返回则为空)

如果err不为空的话。就输出http serve failed,error:"+报错信息,并返回(有异常发生就终止服务、不再监听),否则一直监听。 

整个代码放在下面:

package main

//注意这里如果是别的package,例如package awesomeProject,那代表着它不能作为单独的文件进行运行,强制运行该文件会报以下错误:
//Error running
//'go build awesomeProject': Cannot run program "C:\Users\24626\AppData\Local\Temp\GoLand\___go_build_awesomeProject.exe" (in directory "C:\awesomeProject"): CreateProcess error=216,
//该版本的 %1 与你运行的 Windows 版本不兼容。请查看计算机的系统信息,然后联系软件发布者。

//引入的包或模块,和java和python的引入方式差不多,只不过这里需要引入的包比java简洁太多了
import (
	"fmt"
	"net/http"
)

//这里是业务函数,接收两个参数:一个是请求接收指针,指向前端传给我们的请求;
//另一个是响应写对象,这里向这个对象中写什么,就会出现怎样的文字,所以我们刚才看到的是"Hello World!"
func sayHello(w http.ResponseWriter, r *http.Request) {
	_, _ = fmt.Fprint(w, "Hello World!!")
}

func main() {
	http.HandleFunc("/hello", sayHello)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Printf("http serve failed, error:%v\n", err)
		return
	}
}
//接下来是main函数主体:HandleFunc用来定义,怎样的url输入会调用哪一个函数,这里定义了"/hello"接口会唤起sayHello方法。
//光有这一行是不行的,因为我们的服务器不是跑一遍就结束的,而是要一直等待客户端的请求,故下一个方法ListenAndServe就定义了监听的端口,并且将错误信息包装成err(若正常返回则为空)
//如果err不为空的话。就输出http serve failed,error:"+报错信息,并返回(有异常发生就终止服务、不再监听),否则一直监听。

 不光能打印信息,我们还能直接做成前后端不分离(甚至感觉对前端过于友好?):2.1 用Go写出http请求响应流_第9张图片

这里:

2.1 用Go写出http请求响应流_第10张图片

 ReadFile方法读文件,从这个html5文件中读出页面,然后b是把信息转成了bytestream,再强制转换成string,给他渲染出来。

我的html文件长如此:

2.1 用Go写出http请求响应流_第11张图片

 其中图片是随便找了一张:

然后我们再启动服务,输入刚刚的网址:

可以看到我们的网页就渲染出来啦!!

不得不说,这go写网页用起来真顺手,言简意赅,也容易懂,谈笑间我也做了个前后端不分离的网页了(/doge)

好啦,这次go的HTTP初体验就到这里啦,下一期马上给大家出Gin框架的相关内容,一定会尽快更的! 

你可能感兴趣的:(Go语言从入门到秒杀系统,golang,http,go语言)