go语言对http协议的支持

http:无状态协议,是互联网中使用http使用http实现计算机和计算机之间的请求和响应

使用纯文本方式发送和接受协议数据,不需要借助专门工具进行分析就知道协议中的数据

服务器端的几个概念

  • Request:用户请求的信息,用来解析用户的请求信息,包括 post、get、cookie、url 等信息

  • Response:服务器需要反馈给客户端的信息

  • Conn:用户的每次请求链接

  • Handler:处理请求和生成返回信息的处理逻辑

http报文的组成

  • 请求行
  • 请求头
  • 请求体
  • 响应头
  • 响应体

多种请求方式:

  • GET:向服务器请求资源地址
  • POST:直接返回请求内容
  • HEAD:只要求响应头
  • PUT:创建资源
  • DELETE:删除资源
  • TRACE:返回请求本身
  • OPTIONS:返回服务器支持HTTP方法列表、
  • CONNECT:建立网络连接
  • PATCH :修改资源

软件模型

  • B/S结构,客户端浏览器/服务器,客户端是运行在浏览器中
  • C/S结构,客户端/服务器,客户端是独立的软件

HTTP POST 简易模型

go对HTTP的支持

在golang的net/http包中提供了HTTP客户端和服务端的实现

Handle Func()可以设置函数的请求路径

LIstenAndServer实现监听服务

单控制器

发给处理器(Handler)

在Golang的net/http包下有ServeMutx实现了Front设计模式的Front窗口,ServeMux负责接收请求并把请求分发给处理器(Handler)

http.ServeMux实现了Handler接口

多控制器

在实际开发中大部分情况是不应该只有一个控制器的,不同的诗求应该交给不同的处理单元.

在Golang中支持两种多处理方式

  • 多个处理器(Handler)

  • 多个处理函数(HandleFunc)

使用多处理器

  • 使用http.Handle把不同的URL绑定到不同的处理器

  • 在浏览器中输入http://localhost:8090/myhandler或http://ocalhost:8090/myother可以访问两个处理器
    方法.但是其他URI会出现404(资源未找到)页面

    package main

    import "net/http"

    type MyHandler struct {
    }
    type MyHandle struct {
    }

    func (m *MyHandle) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("MyHandle--第二个"))
    }

    func (m *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("MyHandler"))
    }

    func main() {
    h := MyHandler{}
    h2 := MyHandle{}
    server := http.Server{Addr: "localhost:8090"}
    http.Handle("/first", &h)
    http.Handle("/second", &h2)
    server.ListenAndServe()
    }

使用多处理函数

复制代码
func first(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "多函数first")
}
func second(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "多函数second")
}

func main() {
    server := http.Server{Addr: "localhost:8090"}
    http.HandleFunc("/first", first)
    http.HandleFunc("/second", second)
    server.ListenAndServe()
}

获取请求头

复制代码
package main

import (
    "fmt"
    "net/http"
)

func param(w http.ResponseWriter, r *http.Request) {
    h := r.Header //map
    fmt.Fprintln(w, h)
    for _, n := range h["Accept-Language"] {
       fmt.Fprintln(w, n)
    }
}

func main() {
    server := http.Server{Addr: ":8090"}
    http.HandleFunc("/param", param)
    server.ListenAndServe()
}

获取请求参数

可以一次性全部获取也可以按照名称获取

相关推荐
火兮明兮10 分钟前
Python训练第四十五天
开发语言·python
2501_9151063216 分钟前
App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)
websocket·网络协议·tcp/ip·http·网络安全·https·udp
我爱Jack22 分钟前
ObjectMapper 在 Spring 统一响应处理中的作用详解
java·开发语言
小白杨树树38 分钟前
【SSM】SpringMVC学习笔记8:拦截器
java·开发语言
冷心笑看丽美人40 分钟前
Spring MVC 之 异常处理
java·开发语言·java-ee·spring mvc
超级小忍42 分钟前
Java集合中Stream流的使用
java·开发语言
搏博1 小时前
将图形可视化工具的 Python 脚本打包为 Windows 应用程序
开发语言·windows·python·matplotlib·数据可视化
zm1 小时前
极限复习c++
开发语言·c++
追风赶月、1 小时前
【QT】认识QT
开发语言·qt
秋田君2 小时前
深入理解JavaScript设计模式之闭包与高阶函数
开发语言·javascript·设计模式