golang web 服务器 request 与 response 处理
介绍常见 web 服务的实现与输入、输出数据处理。包括:静态文件服务、js 请求支持、模板输出、表单处理、Filter 中间件设计。
一、静态文件服务支持
访问 html 静态网页是 web 基础服务。
代码与文件结构:: github.com/pmlpml/golang-learning/web/cloudgo-static
1.1 使用文件服务
一般来说,生产环境静态文件的访问交给 WEB 服务器 Apache / Lighttpd / Nginx 处理。在开发、测试阶段也可以让 net/http 库处理。
server.go
package service
import (
"net/http"
"os"
"github.com/codegangsta/negroni"
"github.com/gorilla/mux"
"github.com/unrolled/render"
)
// NewServer configures and returns a Server.
func NewServer() *negroni.Negroni {
formatter := render.New(render.Options{
IndentJSON: true,
})
n := negroni.Classic()
mx := mux.NewRouter()
initRoutes(mx, formatter)
n.UseHandler(mx)
return n
}
func initRoutes(mx *mux.Router, formatter *render.Render) {
webRoot := os.Getenv("WEBROOT")
if len(webRoot) == 0 {
if root, err := os.Getwd(); err != nil {
panic("Could not retrive working directory")
} else {
webRoot = root
//fmt.Println(root)
}
}
//mx.HandleFunc("/api/test", apiTestHandler(formatter)).Methods("GET")
mx.PathPrefix("/").Handler(http.FileServer(http.Dir(webRoot + "/assets/")))
}
Go 的 net/http 包中提供了静态文件的服务,ServeFile
和 FileServer
等函数。
首先我们需要在服务器上创建目录,以存放静态内容。例如:
assets(静态文件虚拟根目录)
|-- js
|-- images
+-- css
仅一条语句就实现了 mx.PathPrefix("/").Handler(http.FileServer(http.Dir(webRoot + "/assets/")))
静态文件服务。它的含义是将 path 以 “/” 前缀的 URL 都定位到 webRoot + "/assets/"
为虚拟根目录的文件系统。 有必要描述这语句中的函数:
http.Dir
是类型。将字符串转为http.Dir
类型,这个类型实现了FileSystem
接口。(Dir 不是函数)http.FileServer()
是函数,返回Handler
接口,该接口处理 http 请求,访问root
的文件请求。mx.PathPrefix
添加前缀路径路由。
创建 assets
目录,不要向该目录放任何内容, 运行程序 go run main.go
!
首先,用浏览器 http;//localhost:8080/
访问。在缺少文件情况下,观察 FileServer 的行为。逐步添加 css
,js
等目录与文件,确认是否可以浏览文件。直到,根目录添加 index.html 看发生了什么?
问题:为什么会添加了 index.html
就显示网页呢? 自己跟踪代码!
1.2 支持 JavaScript 访问
随着 web 页面技术的进步,页面中大量使用 javascript。 添加一个服务:
apitest.go
package service
import (
"net/http"
"github.com/unrolled/render"
)
func apiTestHandler(formatter *render.Render) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
formatter.JSON(w, http.StatusOK, struc