快速入门:创建第一个 Web 应用

学习完 Go 语言的基础知识,接下来,我们来学习 Go Web 编程。

遵循程序员的传统,我们从 Web 应用版"Hello World"式服务开始。

HTTP 服务器实现

首先,我们基于 HTTP 编程中介绍的 net/http 包来实现一个简单的 HTTP 服务器作为 Web 服务器:

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)
    }
}

在这段代码中,我们在入口函数中通过 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 "你好,学院君!";  // 发送响应到客户端
});

然后启动 PHP 内置 Web 服务器监听客户端请求,默认监听的是 8000 端口(PHP 中这块逻辑底层帮我们封装好了,开发者只需要关心上层业务逻辑代码即可):

php artisan serve

-w612

客户端请求测试

接下来,我们对 Go 语言实现的简易 Web 应用进行测试,要启动 Golang 的 HTTP 服务器,需要在对应代码所在目录运行如下代码:

go run server.go

然后在浏览器中请求 http://localhost:9091,页面显示如下:

不带参数的客户端请求

服务端也会输出对应的请求日志:

golang 服务端日志

然后我们在客户端请求中带上参数信息:

带参数的客户端请求

此时,服务端就会打印对应的参数字段值出来:

golang 服务端日志

Laravel 中的对比测试

如果要在基于 PHP Laravel 框架编写的测试应用中体验类似输出,需要先安装如下扩展包使得 dump 函数打印信息出现在服务端日志而不是渲染到客户端浏览器:

composer require --dev beyondcode/laravel-dump-server

然后再另外打开一个窗口执行如下命令用于打印服务端 dump 函数输出:

启动 dump server

然后我们在浏览器访问 http://localhost:8000,同样显示欢迎信息如下:

请求 php web 服务器

此时没有带任何参数,Dump Server 打印日志如下:

dump server 输出日志

如果带上参数,比如 http://localhost:8000?username=学院君&tutorial=Laravel从入门到精通教程&topic=Web编程,则 Dump Server 也会打印出详细的请求数据:

dump server 输出日志

上一篇: 没有上一篇了

下一篇: HTTP 请求处理的底层机制