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()
}

获取请求参数

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

相关推荐
蹊黎2 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
程序猿追8 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓8 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播8 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
墨云安全9 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠10 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y10 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
jimy111 小时前
c++的 Type Traits (一)
开发语言·c++
Web极客码12 小时前
Python Ollama 本地 Agent 入门与订单查询实践
开发语言·jvm·python
kimnoic12 小时前
PHP 8.2的DNF类型怎么用才规范
开发语言·php