这是我参与8月更文挑战的第5天,活动详情查看: 8月更文挑战
Web 应用程序是一种可以通过 Web 访问的应用程序,Web 程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。Web 应用对于身处互联网时代的我们来说太普遍。无论哪一种语言,只要它能够开发出与人类交互的软件,它就必然会支持 Web 应用开发。
本系列文章将会介绍 Go Web 的应用与实践。欢迎关注。
上一篇文章主要分析了收发请求的其他过程,并重点分析了请求体的解析。本文将会介绍返回响应体的具体过程。
组织返回响应体
服务端处理完请求之后,具体是如何将指定的内容作为响应发送给客户端?在上一篇文章的示例中可以看到,我们是通过 ResponseWriter
接口,处理器可以通过这个接口创建 HTTP 响应。ResponseWriter
接口具有如下 3 个方法:
type ResponseWriter interface {
Header() Header
Write([]byte) (int, error)
WriteHeader(statusCode int)
}
复制代码
- Write 方法:接收一个字节数组作为参数,并将字节数组写入 HTTP 响应的主体中,如果在使用 Write 方法执行写入操作时,没有为首部设置响应的内容类型,则响应的内容类型由被写入的前 512 字节决定;
- WriteHeader 方法:接受一个代表 HTTP 响应状态码的整数作为参数,并将这个整数用作 HTTP 响应的返回状态码;在调用这个方法之后,用户可以对
ResponseWriter
写入,但是不能对响应的首部做任何写入操作。如果用户在调用 Write 方法之前没有执行过 WriteHeader 方法,默认会使用 200(OK) 作为响应的状态码。 - 通过Header 方法可以取得一个由首部组成的映射,修改这个映射就可以修改首部,修改后的首部将被包含在 HTTP 响应里面,并随着响应一同发送给客户端。
下面我们通过一个具体的示例来演示如何应用 ResponseWriter
接口的三个方法组织客户端的响应。
import (
"encoding/json"
"log"
"net/http"
)
type User struct {
Name string
Habits []string
}
func write(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("X-Custom-Header", "custom") // 设置自定义的头部
w.WriteHeader(201) // 设置创建用户的状态码
user := &User{
Name: "aoho",
Habits: []string{"balls", "running", "hiking"},
}
json, _ := json.Marshal(user)
w.Write(json) // 写入创建成果的用户
}
func main() {
http.HandleFunc("/write", write) //设置访问的路由
err := http.ListenAndServe(":8080", nil) //设置监听的端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
复制代码
如上的示例中,我们构造的是创建用户成功之后的响应结果。如上代码所示,我们首先设置了响应的 Content-Type
头部为 application/json
,并设置自定义的头部(实际应用中根据需要进行设置);设置创建用户之后的响应状态码为 201(201 为创建成功);构造了响应的 Body 为创建的 User 信息,包括用户名和兴趣爱好。请求的结果如下面两张图所示。
我们模拟 Post 请求,访问 http://127.0.0.1:8080/write
,响应的状态码为 201,Body 为创建成功返回的 User 信息。
上图所示为返回的头部信息,包含了我们设定的 Content-Type
和自定义的头部,符合预期。
小结
本文主要解析了返回响应体的实现,通过一个具体的示例来演示如何应用 ResponseWriter
接口的三个方法组织客户端的响应。至此,http 基础部分都已介绍完成,下面的文章将会进入 Go Web 流行框架的介绍与实践。
阅读最新文章,关注公众号:aoho求索