Go中处理请求

栏目: Go · 发布时间: 5年前

内容简介:Go 语言 HTTP 服务器,在启动监听并处理接收的请求时,会将请求相关数据封装成通过除此之外,请求值对象

1 概述

Go 语言 HTTP 服务器,在启动监听并处理接收的请求时,会将请求相关数据封装成 http.Request 对象,同时作为参数传递到请求处理器中。处理器函数的第二个参数就是对 http.Request 对象的一个引用,示例代码为:

func main() {
  // 设置 路由
  http.HandleFunc("/", IndexAction)·
  // 开启监听
  log.Fatal(http.ListenAndServe(":8888", nil))
}
func IndexAction(w http.ResponseWriter, r *http.Request) {
  w.Write([]byte(`<h1 align="center">来自小韩说课的问候</h1>`))
}

2 http.Request 结构

type Request struct {
  Method string // 请求方法,"" 默认为 GET
  URL *url.URL // URL 对象引用
  Proto      string // 协议 "HTTP/1.0"
  ProtoMajor int    // 1
  ProtoMinor int    // 0
  Header Header // 请求头对象
  Body io.ReadCloser // 请求主体对象
  GetBody func() (io.ReadCloser, error) // 获取请求主体的拷贝函数,用于客户端场景
  ContentLength int64 // 请求主体长度
  TransferEncoding []string // 转换编码
  Close bool // 是否在结束后关闭连接
  Host string // 主机
  Form url.Values // 解析好的 form 数据,同时包含 URL 中的 QueryString,调用 ParseForm() 后生效
  PostForm url.Values // 解析好的 POST、PUT、PATCH 的 form 数据,调用 ParseForm() 后生效
  MultipartForm *multipart.Form // 解析好的 multipart form,包含上传文件
  Trailer Header // 指定请求发送后的附加头信息
  RemoteAddr string // 请求来源地址
  RequestURI string // 请求行中未修改的请求URI,通常使用 URL 字段代替
  TLS *tls.ConnectionState // TLS 状态信息对象
  Cancel <-chan struct{} // 指示客户端请求可取消的闭包通道
  Response *Response // 重定向到引发本次请求的响应对象
  ctx context.Context // 服务器与客户端的上下文
}

3 请求方式

func IndexAction(w http.ResponseWriter, r *http.Request) {
  log.Print(r.Method)
}
// GET

4 请求参数

通过 URL.Query() 方法可以获取查询字符串值 URL.values 对象,是一个映射结构。对象上的 .Get(key string) 方法获取 key 对应的第一个值。

// http://localhost:8888/?name=Hank
func IndexAction(w http.ResponseWriter, r *http.Request) {
  log.Print(r.URL.Query())
  log.Print(r.URL.Query()["name"])
  log.Print(r.URL.Query().Get("name"))
}
// map[name:[Hank]]
// [Hank]
// Hank

除此之外,请求值对象 URL.Values 还支持:

func (v Values) Set(key, value string)
func (v Values) Add(key, value string)
func (v Values) Del(key string)
func (v Values) Encode() string

5 请求头

请求对象的 Header 属性可以访问到请求头信息。是映射结构,提供了 Get(key string) 方法获取 key 对应的第一个值。

// http://localhost:8888/
func IndexAction(w http.ResponseWriter, r *http.Request) {
  log.Print(r.Header)
  log.Print(r.Header["User-Agent"])
  log.Print(r.Header.Get("User-Agent"))
}
// map[User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36] Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9,en;q=0.8] Connection:[keep-alive] Cache-Control:[max-age=0] Upgrade-Insecure-Requests:[1]]
// [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36]
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

除此之外, Header 对象还支持:

func (h Header) Set(key, value string)
func (h Header) Add(key, value string)
func (h Header) Del(key string)
func (h Header) Write(w io.Writer) error

6 请求 URL

Request.URL 引用的是 url.URL 结构体类型,利用该对象可以获取 URL 相关信息。其定义结构为:

type URL struct {
  Scheme     string // 协议
  Opaque     string    // 编码数据
  User       *Userinfo // username 和 password 信息
  Host       string    // 主机,格式为 host:port
  Path       string    // 路径(相对路径会省略前导斜钱)
  RawPath    string    // 编码 path (see EscapedPath method)
  ForceQuery bool      // 追加查询 ('?') 即使 RawQuery 为空
  RawQuery   string    // 编码查询字符串, 不包括 '?'
  Fragment   string    // 引用片段, 不包括 '#'
}

典型的URL格式为: scheme://[userinfo@]host/path[?query][#fragment]

注意,服务器端程序会获取 URI 信息而客户端信息会获取 URL 信息。

示例:

// http://localhost:8888/path/to/script.html
func IndexAction(w http.ResponseWriter, r *http.Request) {
  log.Print(r.URL.Path)
}
// /path/to/script.html

完! 原文出自: 小韩说课 微信关注:小韩说课 Go中处理请求


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design systems

Design systems

Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试