go语言学习之Web 应用程序请求和响应

我爱海鲸 2023-07-17 22:12:28 go语言学习

简介请求和响应

0、链接上一篇文章:go语言学习之使用 Go 标准库构建 Web 应用程序

1、net/ http包提供了用于表示HTTP 消息的结构

Reqeust(是个struct),代表了客户端发送的HTTP请求消息

重要的字段:

URL

Header

Bady

 Form、PostForm、MultipartForm

也可以通过 Request的方法访问请求中的Cookie、URL、User Agent等信息

Request 即可代表发送到服务器的请求,又可代表客户端发出的请求

2、请求的URL

Request的URL字段就代表了请求行(请求信息第一行)里面的部分内容

URL字段是指向url.URL类型的一个指针,url.URL是一个struct: 

type URL struct {
	Scheme string
	Opaque string
	User *Userinfo
	Host string
	Path string
	RawQuery string
	Fragment string
}

3、URL 的通用形式

通用格式是:scheme://[userinfo@]host/path[?query][ffragment]

不可以斜杠开头的URL被解释为:scheme:opaque[?query][#fragment]

4、URL Query

RawQuery会提供实际查询的字符串。
例如:http:// www.example.com/post?id=123tthread_id=456·它的 RawQuery的值就是id=123tthread_id=456

还有一个简便方法可以得到Key-Value对:通过 Request的 Form字段(以后再说)

5、 URL Fragment

如果从浏览器发出的请求,那么你无法提取出Fragment字段的值

浏览器在发送请求时会把fragment部分去掉

但不是所有的请求都是从浏览器发出的(例如从HTTP客户端包)

 

6、Request Header

请求和响应(Request、Response)的headers是通过 Header类型来描述的,它是一个map,用来表述HTTP Header里的Key-Value对。

Header map的 key是string类型,value是[string]

设置key的时候会创建一个空的[string 作为value,value里面第一个元素就是新header 的值;

为指定的key添加一个新的header值,执行append 操作即可

go相关的字段

 r.Header

返回map
r.Header["Accept-Encoding"]

返回:[gzip, deflate]([]string 类型)

r.Header.Get("Accept-Encoding")

返回:gzip, deflate (string类型)

8、Request Body

请求和响应的 bodies都是使用 Body字段来表示的

Body是一个io.ReadCloser接口
 一个 Reader接口

一个Closer 按口

Read接口定义了一个Open方法: 

参数:[]byte

返回: byte 的数量、可选的错误

Closer接口定义了一个Close方法:

没有参数,返回可选的错误

想要读取请求body的内容,可以调用Body的 Read方法(例子)

package main

import (
	"fmt"
	"net/http"
)

func main() {
	server := http.Server{
		Addr: "localhost:8080",
	}
	
	http.HandleFunc(" /post", func(w http.ResponseWriter, r *http.Request) {
		length := r.ContentLength
		body := make([]byte, length)
		r.Body.Read(body)
		fmt.Fprintln(w, string(body))
	})
	
	server.ListenAndServe()
}

 

 

你好:我的2025