学习完 Go 语言的基础知识,接下来,我们来学习 Go Web 编程。
遵循程序员的传统,我们从 Web 应用版"Hello World"式服务开始。
1、HTTP 服务器实现
首先,我们基于 HTTP 编程中介绍的 net/http 包来实现一个简单的 HTTP 服务器作为 Web 服务器:
代码语言:javascript复制package main
import (
"fmt"
"log"
"net/http"
"strings"
)
func sayHelloWorld(w http.ResponseWriter, r *http.Request) {
r.ParseForm() // 解析参数
fmt.Println(r.Form) // 在服务端打印请求参数
fmt.Println("URL:", r.URL.Path) // 请求 URL
fmt.Println("Scheme:", r.URL.Scheme)
for k, v := range r.Form {
fmt.Println(k, ":", strings.Join(v, ""))
}
fmt.Fprintf(w, "你好,学院君!") // 发送响应到客户端
}
func main() {
http.HandleFunc("/", sayHelloWorld)
err := http.ListenAndServe(":9091", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
代码语言:javascript复制
在这段代码中,我们在入口函数中通过 http.HandleFunc()
方法定义了一个路由 /
和对应的路由处理函数 sayHelloWorld
(在该函数中,r
代表请求对象,w
代表响应对象),然后通过 http.ListenAndServe
启动这个 HTTP 服务器,并设置监听端口为 9091
。
Laravel 中的对比实现
如果与 PHP 应用类比的话,以 Laravel 框架为例,上述路由定义操作类似我们在 routes/web.php
定义一个这样一个首页路由:
Route::get('/', function(Request $request) {
dump($request->all()); // 打印请求数据
dump("URL:" . $request->path()); // 请求路径
dump("Scheme:", $request->getScheme()); // 获取 Scheme
foreach ($request->all() as $key => $value) {
dump($key . ":" . $value);
}
return "你好,学院君!"; // 发送响应到客户端
});
代码语言:javascript复制
然后启动 PHP 内置 Web 服务器监听客户端请求,默认监听的是 8000
端口(PHP 中这块逻辑底层帮我们封装好了,开发者只需要关心上层业务逻辑代码即可):
2、客户端请求测试
接下来,我们对 Go 语言实现的简易 Web 应用进行测试,要启动 Golang 的 HTTP 服务器,需要在对应代码所在目录运行如下代码(假设服务端代码存放在 server.go 中):
代码语言:javascript复制go run server.go
然后在浏览器中请求 http://localhost:9091
,页面显示如下:
服务端也会输出对应的请求日志:
然后我们在客户端请求中带上参数信息:
此时,服务端就会打印对应的参数字段值出来:
Laravel 中的对比测试
如果要在基于 PHP Laravel 框架编写的测试应用中体验类似输出,需要先安装如下扩展包使得 dump
函数打印信息出现在服务端日志而不是渲染到客户端浏览器:
composer require --dev beyondcode/laravel-dump-server
然后再另外打开一个窗口执行如下命令用于打印服务端 dump
函数输出:
然后我们在浏览器访问 http://localhost:8000
,同样显示欢迎信息如下:
此时没有带任何参数,Dump Server 打印日志如下:
如果带上参数,比如 http://localhost:8000?username=学院君&tutorial=Laravel从入门到精通教程&topic=Web编程
,则 Dump Server 也会打印出详细的请求数据: