Go Web 入门与实战系列:如何组织返回响应体

这是我参与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 信息,包括用户名和兴趣爱好。请求的结果如下面两张图所示。

请求地址与响应的body

我们模拟 Post 请求,访问 http://127.0.0.1:8080/write,响应的状态码为 201,Body 为创建成功返回的 User 信息。

image.png

上图所示为返回的头部信息,包含了我们设定的 Content-Type 和自定义的头部,符合预期。

小结

本文主要解析了返回响应体的实现,通过一个具体的示例来演示如何应用 ResponseWriter 接口的三个方法组织客户端的响应。至此,http 基础部分都已介绍完成,下面的文章将会进入 Go Web 流行框架的介绍与实践。

阅读最新文章,关注公众号:aoho求索

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享