当前位置:首页 > Web开发 > 正文

对请求的处理

2024-03-31 Web开发

标签:

对请求的处理

Go 语言的 net/http 包提供了一系列用于表示 HTTP 报文的结构,我们可以使用它
处理请求和发送相应,其中 Request 结构代表了客户端发送的请求报文,下面让我们看
一下 Request 结构体

获取请求 URL

Request 结构中的 URL 字段用于表示请求行中包含的 URL,改字段是一个指向
url.URL 结构的指针

 Path 字段

获取请求的 URL

例如::8080/hello?username=admin&password=123456

注: 通过 r.URL.Path 只能得到 /hello

RawQuery 字段

获取请求的 URL 后面?后面的查询字符串

例如::8080/hello?username=admin&password=123456

注: 通过 r.URL.RawQuery 得到的是 username=admin&password=123456

获取请求头中的信息

通过 Request 结果中的 Header 字段用来获取请求头中的所有信息,,Header 字段
的类型是 Header 类型,而 Header 类型是一个 map[string][]string,string 类型的 key,
string 切片类型的值。

获取请求头中的所有信息

r.Header

得到的结果如下:

map[User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36] Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,ima ge/apng,*/*;q=0.8] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh- CN,zh;q=0.9,en-US;q=0.8,en;q=0.7] Connection:[keep-alive] Upgrade-Insecure- Requests:[1]] 获取请求头中的某个具体属性的值,如获取 Accept-Encoding 的值

方式一:r.Header[“Accept-Encoding”]

得到的是一个字符串切片

结果[gzip, deflate, br]

方式二:r.Header.Get(“Accept-Encoding”)

得到的是字符串形式的值,多个值使用逗号分隔

结果gzip, deflate, br

获取请求体中的信息

请求和响应的主体都是有 Request 结构中的 Body 字段表示,这个字段的类型是
io.ReadCloser 接口,该接口包含了 Reader 接口和 Closer 接口,Reader 接口拥有 Read
方法,Closer 接口拥有 Close 方法

通过指定 method=”post”来发送一个 POST 请求

由于 GET 请求没有请求体,所以我们需要在 HTML 页面中创建一个 form 表单,通
过指定 method=”post”来发送一个 POST 请求

表单

<html> <head> <meta charset="UTF-8"/> </head> <body> <form action=":8080/getBody" method="POST" enctype="multipart/form-data"> 用户名:<input type="text" name="username" /><br/> 密码:<input type="password" name="password" /><br/> <input type="submit" /> </form> </body> </html>

服务器处理请求的代码

package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { //获取内容的长度 length := r.ContentLength //创建一个字节切片 body := make([]byte, length) //读取请求体 r.Body.Read(body) fmt.Fprintln(w, "请求体中的内容是:", string(body)) } func main() { http.HandleFunc("/getBody", handler) http.ListenAndServe(":8080", nil) }

在浏览器上显示的结果

请求体中的内容是: username=hanzong&password=666666

获取请求参数

下面我们就通过 net/http 库中的 Request 结构的字段以及方法获取请求 URL 后面
的请求参数以及 form 表单中提交的请求参数

Form 字段

1) 类型是 url.Values 类型,Form 是解析好的表单数据,包括 URL 字段的 query
参数和 POST 或 PUT 的表单数据。
2) Form 字段只有在调用 Request 的 ParseForm 方法后才有效。在客户端,会忽
略请求中的本字段而使用 Body 替代
1) 获取表单中提交的请求参数(username 和 password)

代码

func handler(w http.ResponseWriter, r *http.Request) { //解析表单 r.ParseForm() //获取请求参数 fmt.Fprintln(w, "请求参数为:", r.Form) } //注意:在执行 r.Form 之前一定要调用 ParseForm 方法 //结果 //请求参数为: map[password:[666666] username:[hanzong]]

d) 如果对 form 表单做一些修改,在 action 属性的 URL 后面也添加相同的请求参
数,如下:

<form action=":8080/getBody?username=admin&pwd=123456" method="POST"> 用 户 名 : <input type="text" name="username" value="hanzong"><br/> 密 码 : <input type="password" name="password" value="666666"><br/> <input type="submit"> </form>

则执行结果如下:

请求参数为:map[username:[hanzong admin] password:[666666] pwd:[123456]]

我们发现:表单中的请求参数 username 和 URL 中的请求参数
username 都获取到了,而且表单中的请求参数的值排在 URL 请求参
数值的前面

如果此时我们只想获取表单中的请求参数该怎么办呢?那就需要使
用 Request 结构中的 PostForm 字段

PostForm 字段

1) 类型也是 url.Values 类型,用来获取表单中的请求参数

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/40169.html