net/http标准库

net/http标准库通常包括两个部分,客户端和服务器,我们可以通过ListenAndServe创建一个简陋的服务器

  1. package main
  2. import (
  3. "net/http"
  4. )
  5. func main() {
  6. http.ListenAndServe("", nil)
  7. }

这会使用默认的80端口进行网络连接,并且使用默认的多路复用器DefaultServeMux,我们也可以通过Server结构进行更详细的配置

  1. func main() {
  2. server := http.Server {
  3. Addr: "127.0.0.1:80",
  4. Handler: nil,
  5. }
  6. server.ListenAndServe()
  7. }

处理器和处理函数

处理器

前面的代码会返回404响应,因为我们还没有为请求编写相应的处理器。一个处理器就是一个拥有ServeHTTPf方法的接口

  1. type Handler interface {
  2. ServeHTTP(ResponseWriter, *Request)
  3. }

我们通过实现这个接口来编写处理器

  1. type MyHandler struct{}
  2. func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  3. fmt.Fprintf(w, "Hello, world")
  4. }
  5. func main() {
  6. handler := MyHandler{}
  7. server := http.Server {
  8. Addr: "127.0.0.1:80",
  9. Handler: &handler,
  10. }
  11. server.ListenAndServe()
  12. }

我们可以设置多个处理器

  1. type HelloHandler struct{}
  2. func (hello *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  3. fmt.Fprintf(w, "hello!")
  4. }
  5. type WorldHandler struct{}
  6. func (world *WorldHandler) ServeHTTP(w http.ResponseWriter, r *http.Reuest) {
  7. fmt.Fprintf(w, "world!")
  8. }
  9. func main() {
  10. hello := HelloHandler{}
  11. world := WorldHandler{}
  12. server := http.Server {
  13. Addr: "127.0.0.1:80",
  14. }
  15. http.Handle("/hello", &hello)
  16. http.Handle("/world", &world)
  17. server.ListenAndServe()
  18. }

我们看一下Handle函数再源码中的定义

  1. func Handle(pattern string, handler Handler) {
  2. DefaultServeMux.Handle(pattern, handler)
  3. }

实际上是在调用DefaultServeMux的某个方法,前面我们已经提到过了DefaultServeMux是个默认多路复用器,实际上它也是个Handler处理器,因为他是ServeMux结构的一个实例,而ServeMux也实现了Handler接口的ServeHTTP方法。这样就可以对不同的请求做出不同的响应。

处理器函数

处理器函数是与处理器拥有同样行为的函数,它们与ServeHTTP拥有同样的函数签名。

  1. func hello (w http.ResponseWriter, r *http.Request) {
  2. fmt.Fprintf(w, "Hello!")
  3. }
  4. func main() {
  5. server := http.Server {
  6. Addr: "127.0.0.1:8080",
  7. }
  8. http.HandleFunc("/hello", hello)
  9. server.ListenAndServe()
  10. }

HandleFunc是Go语言拥有的一种函数类型,它可以把一个带有正确签名的f转换为带有方法f的handler。

来看看HandleFunc的源码

  1. func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
  2. DefaultServeMux.HandleFunc(pattern, handler)
  3. }
  4. func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
  5. if handler == nil {
  6. panic("http: nil handler")
  7. }
  8. mux.Handle(pattern, HandlerFunc(handler))
  9. }

Handle函数是不是似曾相识!

串联多个处理器和处理器函数

  1. func hello(w *http.ResponseWriter, r *Request) {
  2. fmt.Fprintf(w, "Hello!")
  3. }
  4. func log(h http.Handler) http.HandlerFunc {
  5. return func(w http.ResponseWriter, r *http.Request) {
  6. fmt.Println("Log!")
  7. h(w, r)
  8. }
  9. }
  10. func main() {
  11. server := http.Server {
  12. Addr: "127.0.0.1:8080",
  13. }
  14. http.HandleFunc("/hello", log(hello))
  15. server.ListenAndServe()
  16. }

其中HandlerFunc是实现了Handler接口的函数类型,源码定义:

  1. type HandlerFunc func(ResponseWriter, *Request)
  2. func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
  3. f(w, r)
  4. }

ServeMux

ServeMux是一个HTTP请求多路复用器,负责接收HTTP请求并根据请求中的URL将请求重定向到正确的处理器。ServeMux包含一个映射,这个映射会将URL映射至相应的处理器。值得一提的是,ServeMux无法使用变量实现URL模式匹配,因此必要时我们完全可以用其它自建的多路复用器来代替ServeMux,如HttpRouter等高效轻量的第三方复用器

Go Web编程 第三章--接收请求的更多相关文章

  1. Go Web编程 第四章--处理请求

    请求和响应 Request结构 URL字段 Header字段 Body字段 Form, PostForm, MultipartForm字段 在处理器函数中,我们可以通过Request获取各个字段的详细 ...

  2. [转]Windows Shell 编程 第三章 【转自:http://blog.csdn.net/wangqiulin123456/article/details/7987901】

    第三章 操作文件 我依然清楚地记得,Windows95 的贝塔版出现的情形,它在朋友之间和学院中传播,好酷,全新的文件管理器,一种全图标,全彩色可客户化的界面,以及活泼的动画标识使得在文件拷贝和删除方 ...

  3. 读高性能JavaScript编程 第三章

    第三章  DOM Scripting  最小化 DOM 访问,在 JavaScript 端做尽可能多的事情. 在反复访问的地方使用局部变量存放 DOM 引用. 小心地处理 HTML 集合,因为他们表现 ...

  4. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

  5. windows核心编程---第三章 内核对象及句柄本质

      本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存 ...

  6. 【1】python核心编程 第三章

    1.继续( \ ) 有两种例外情况一个语句不使用反斜线也可以跨行.在使用闭合操作符时,单一语句可以跨多行,例如:在含有小括号.中括号.花括号时可以多行书写.另外就是三引号包括下的字符串也可以跨行书写 ...

  7. python核心编程-第三章-个人笔记

    1.语句和语法 (1)反斜杠"\"表示语句继续.python良好的编程习惯是一行最后不超过80个字符,一行字符过多时便须用到反斜杠换行继续该语句. PS:在使用小括号.中括号.大括 ...

  8. JavaWeb核心编程之(三.5)HTTP请求和接受表单数据

    HTTP简介WEB浏览器与WEB拂去其之间的一问一答的交互过程, 必须遵循一定的规则,这个规则就是HTTP协议HTTP是hypertext transfer protocol(超文本传输协议)的简写, ...

  9. WEB安全第三篇--控制请求的艺术:CSRF和SSRF

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

随机推荐

  1. msfpayload反弹shell

    1.前期-- 情景就是当我们获得webshell时,我们想留下我们的后门,这个时候我们可以用到msfpayload与msfconsole结合使用 启动PostgreSQL服务:service post ...

  2. 多校 HDU 6397 Character Encoding (容斥)

    题意:在0~n-1个数里选m个数和为k,数字可以重复选: 如果是在m个xi>0的情况下就相当于是将k个球分割成m块,那么很明显就是隔板法插空,不能为0的条件限制下一共k-1个位置可以选择插入隔板 ...

  3. 修复TortoiseGit文件夹和文件图标不显示问题的多种解决办法以及重启之后TortoiseGit图标注册表又不见了的解决办法

    一 首先进行第一种尝试 打开 regedit.exe ,准备修改注册表 找到 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ ...

  4. perl6 Net::HTTP 不能发送https请求

    如下命安装必要的包: sudo apt install libssl1.0.0 libssl-dev zef install IO::Socket::SSL zef install Net::HTTP

  5. Linux XOR.DDoS样本取证特征与清除

    一.取证特征 1)获取进程ID 使用top命令,查看占用内存率最高的十位随机名称进程名(示例:进程名pygdykcrqf) 2)获取进程对应路径 Linux 在启动一个进程时,系统会在/proc下创建 ...

  6. Django-模板语言和过滤器

    Django模板语言 首先模板只是一个文本文件,它可以生成任何基于文本的格式(HTML.XML.CSS等),模板中包含变量,在模板被渲染的时候替换为最终的值,以及控制模板逻辑的标签. 变量使用{{ 变 ...

  7. JSP中page,request,session,application四个域对象区别

    page page指当前页面.只在一个jsp页面里有效 . page里的变量没法从index.jsp传递到test.jsp,只要页面跳转了,它们就不见了. pageContext 如果把变量放到pag ...

  8. linux 命令之cut

    cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut  [-bn] [file] 或 cut ...

  9. Luogu P3384 【【模板】树链剖分】

    转载请注明出处,部分内容引自banananana大神的博客 ~~别说你不知道什么是树~~╮(─▽─)╭(帮你百度一下) 先来回顾两个问题:1,将树从x到y结点最短路径上所有节点的值都加上z 这也是个模 ...

  10. 手工增加Mapping

    [root@es ~]# curl -H "Content-Type:application/json" -XPOST "http://127.0.0.1:9200/t_ ...