Go中处理请求

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

内容简介: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中处理请求


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

查看所有标签

猜你喜欢:

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

数据挖掘导论

数据挖掘导论

(美)Pang-Ning Tan、Michael Steinbach、Vipin Kumar / 机械工业出版社 / 2010-9 / 59.00元

本书全面介绍了数据挖掘的理论和方法,着重介绍如何用数据挖掘知识解决各种实际问题,涉及学科领域众多,适用面广。 书中涵盖5个主题:数据、分类、关联分析、聚类和异常检测。除异常检测外,每个主题都包含两章:前面一章讲述基本概念、代表性算法和评估技术,后面一章较深入地讨论高级概念和算法。目的是使读者在透彻地理解数据挖掘基础的同时,还能了解更多重要的高级主题。 本书特色 ·包含大量的图表、......一起来看看 《数据挖掘导论》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

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

在线XML、JSON转换工具