第1章 Go与Web应用

理解Go适合Web应用的工程原因,拆解HTTP请求、响应、URI、HTTP/2、handler与template engine。

从浏览器为何能调用Go开始

先预测:浏览器访问一个URI时,是否直接调用Go函数?不是。客户端发送HTTP消息,服务器解析后选择handler,再把结果编码为响应。把网络协议与函数调用分开。

Go为何适合Web应用

编译产物、垃圾回收、静态类型、标准库和轻量并发共同降低交付成本。比“框架少”更重要;性能也必须由测量证明,不能从语言标签推导。

func main() {
    http.HandleFunc("/", hello)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Web应用如何工作

DNS、连接、HTTP请求、路由、handler、存储和模板按顺序协作。只拥有一次请求,不应启动无法取消的后台工作。

HTTP请求

请求包含method、URI、版本、header和可选body。GET与HEAD应安全,PUT与DELETE按语义应幂等,但服务器实现仍要维护不变量。不等于每次响应字节完全相同。

POST /threads HTTP/1.1
Content-Type: application/x-www-form-urlencoded
 
title=Go

HTTP响应、URI与HTTP/2

响应由状态行、header和body组成;URI标识资源位置与查询。HTTP/2改变连接上的帧和stream复用,不改变handler看到的高层请求语义。要求写body前确定状态和header。

Handler与Template Engine

Handler处理协议和业务,template engine把数据与展示程序组合。应默认使用html/template处理上下文转义。

func hello(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    w.WriteHeader(http.StatusOK)
    _, _ = io.WriteString(w, "hello")
}

验收实验:原始消息到Handler

用curl分别发送GET、POST和不支持的方法,保存请求行、header、状态和body;随后切换HTTP/1.1与HTTP/2客户端,确认业务handler行为一致。故意在Write后修改状态码,观察为何响应已提交。

本章回顾

本章覆盖Go与Web应用、可扩展、模块化、可维护与高性能Web应用、Web应用如何工作、HTTP请求与响应、URI、HTTP/2、处理器与模板引擎,以及Hello Go Web应用。下一章会把这些部件装进完整论坛。

术语表

讨论

评论区加载中…