博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go中的http服务流程、路由以及http中间件的使用
阅读量:5290 次
发布时间:2019-06-14

本文共 1646 字,大约阅读时间需要 5 分钟。

  • 简介

  服务端的http主要用作接受客服端的request读取用户传入的信息,并将处理信息后的结果通过response返回给客户端。在接受request的过程中最重要的一个环节就是路由(router),也就是实现一个Multiplexer器。Multipllexer路由将url匹配信息与处理器函数(handler)连接起来,当用户访问的url与路由中的url匹配,则会调用对应的处理器(handler)。Go 中内置了一个Multiplexer--DefaultServeMux。

  总结一下http服务的流程就是:

  1. 首先客户端(client)发起请求(Requests)
  2. 路由(router)匹配用户发起的请求,并调用对应的处理器(handler)
  3. 处理器(handler)根据用户传入的数据返回对应的信息
  4. 信息通过response返回给客户端

  由以上流程中我们可以看出来,要理解Go http服务流程最重要的就是要先理解路由(router)和Handler

  • Handler

  首先我们来看一下Go内部定义的Handler的接口

 

type Handler interface{     ServeHTTP(ResponseWriter, *Request)  }

  看完Handler接口之后,我们不得不补充一点知识,才能继续深入Handler

  那就是Go在设计时并没有引入类的继承这样的概念,而是使用了一种不常用的设计模式Duck Typing(它看起来像一只鸭子,那么它就是一只鸭子)。这种模式通过特征识别的方法来判断类的归属,也就是说如果有两个结构体,他们有相同的属性,并且实现了同样的方法,那么我们就认为这两个结构体属于同一个类

  所以说我们从以上的Handler接口定义可以知道,任何结构体,只要实现了ServeHTTP方法,这个结构体就可以称之为Handler对象。

  处理器函数: 实现了以下签名的函数被称作handler处理器函数

      func handlerName (w http.ResponseWriter, r *http.Request){} 

  Handler函数:经过HandlerFunc()包装过的处理器函数,处理器函数在HandlerFunc这个函数内部实现了ServeHTTP接口方法的函数。也就是说处理器在被HandlerFunc包装过后实现了Handler的接口

  Handler对象:实现Handler接口中的ServeHTTP方法的结构

 

  Http Server实例:

 

package mainimport{  "fmt"  "net/http"    }//SayHello函数实现了处理器的签名,所以这是一个处理器函数func SayHello(w http.ResponseWriter, r *http.Request){     fmt.Println("Hello!!!")    fmt.Fprintf(w, "Hello!!!")    }func main(){
//注册路由,将url规则与处理器函数绑定做一个map映射存起来,并且会实现ServeHTTP方法,使处理器函数变成Handler函数 http.HandleFunc("/", SayHello)   //开始监听端口,没进入一个连接,就会生成一个GoRoutine err := http.LinstenAndServe("0.0.0.0:8989", nil) if err != nil { fmt.Println("http listen failed") } }

 

 

 

  • 使用外部路由库,使路由绑定更方便功能更完备(待完成)
  • Http中间件的使用与原理(待完成)

 

转载于:https://www.cnblogs.com/yinqingzheng/p/10402675.html

你可能感兴趣的文章
js基础
查看>>
Js函数初学者练习(一)switch-case结构实现计算器。
查看>>
P2P综述
查看>>
细读 php json数据和JavaScript json数据
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
Servlet3.0新特性
查看>>
java内存溢出怎么解决
查看>>
JS对象以及"继承"
查看>>
Ewebeditor最新漏洞及漏洞大全
查看>>
socket计划编制的原则
查看>>
sqlite3经常使用命令&语法
查看>>
[leetcode] 309. Best Time to Buy and Sell Stock with Cooldown(medium)
查看>>
解决微信授权回调页面域名只能设置一个的问题 [php]
查看>>
数组去重一步到位
查看>>
HDU 4671 Backup Plan 构造
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>