第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应用。下一章会把这些部件装进完整论坛。 术语表← 上一章《Go Web编程》学习地图下一章 →第2章 Go ChitChat讨论评论区加载中…