beego3---gohttp底层实现

简介:
复制代码
package main

//gohttp底层实现,通过gohttp不是通过beego实现的输出
//

import (
    "io"
    "log"
    "net/http"
)

func main() {
    //设置路由
    http.HandleFunc("/", sayHello)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

func sayHello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello vwesion1")
}
复制代码

 

复制代码
package main

//gohttp第二个版本:通过mux,handler实现路由

import (
    "io"
    "log"
    "net/http"
)

func main() {
    mux := http.NewServeMux()      //ServeMux//实现handler注册到ServeMux然后在进行路由的注册
    mux.Handle("/", &myHandler{})  //注册路由和handler
    mux.Handle("/hello", sayHello) //通过函数注册路由

    err := http.ListenAndServe(":8080", mux)
    if err != nil {
        log.Fatal(err)
    }
}

type myHandler struct { //这个handle要实现ServerHTTP方法

}

func (this *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello vwesion2,"+r.URL.String())
}

func sayHello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello vwesion2,"+r.URL.String())
}
复制代码

 

复制代码
package main

//模拟gohttp底层,第三个版本

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "os" //获取静态文件
    "time"
)

func main() {
    server := http.Server{
        Addr:        ":8080",
        Handler:     &myHandler{}, //自定义handler
        ReadTimeout: 5 * time.Second,
    }

    myMux = make(map[string]func(http.ResponseWriter, *http.Request)) //初始化map
    myMux["/"] = sayHello                                             //访问根目录调用sayHellp方法
    myMux["/bye"] = sayBye                                            //访问/bye调用sayBye方法

    err := server.ListenAndServe()
    if err != nil {
        log.Fatal(err)
    }
}

type myHandler struct{}

func (this *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { //handler来解析url,调用不同的方法,
    if h, ok := myMux[r.URL.String()]; ok { //if ok 对map的断言,ok是判断存不存在,h是获取的map的value,
        fmt.Println(h, ok)
        h(w, r)
        return
    }
    io.WriteString(w, "uuuu,"+r.URL.String())
}

var myMux map[string]func(http.ResponseWriter, *http.Request) //自定义mux,根据不同的string调用不同的方法

func sayHello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello "+r.URL.String())
}

func sayBye(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "sayBye "+r.URL.String())
}
复制代码

 

复制代码
package main

//获取静态文件

import (
    "io"
    "log"
    "net/http"
    "os" //获取路径,静态文件服务器要获取绝对路径,根据当前路径定位到绝对路径,
)

func main() {
    mux := http.NewServeMux()      //ServeMux//实现handler注册到ServeMux然后在进行路由的注册
    mux.Handle("/", &myHandler{})  //注册路由和handler
    mux.Handle("/hello", sayHello) //通过函数注册路由

    wd, err := os.Getwd() //wd是当前路径
    if err != nil {
        log.Fatal(err)
    }

    mux.Handle("/static/",
        http.StripPrefix("/static/", http.FileServer(http.Dir(wd)))) //StripPrefix去除static前缀

    err = http.ListenAndServe(":8080", mux)
    if err != nil {
        log.Fatal(err)
    }
}

type myHandler struct { //这个handle要实现ServerHTTP方法

}

func (this *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello vwesion2,"+r.URL.String())
}

func sayHello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "hello vwesion2,"+r.URL.String())
}
复制代码
相关文章
|
10月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
491 61
|
10月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
8月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
9月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
9月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
620 0
|
JSON 安全 前端开发
类型安全的 Go HTTP 请求
类型安全的 Go HTTP 请求
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
339 13
|
数据采集 缓存 IDE
Go中遇到http code 206和302的获取数据的解决方案
文章提供了解决Go语言中处理HTTP状态码206(部分内容)和302(重定向)的方案,包括如何获取部分数据和真实请求地址的方法,以便程序员能快速完成工作,享受七夕时光。
1403 0
Go中遇到http code 206和302的获取数据的解决方案
|
程序员 Go 网络架构
不看就落后了,Go 1.22 中更好的http router
不看就落后了,Go 1.22 中更好的http router
|
网络协议 程序员 应用服务中间件
Swoole与Go系列教程之HTTP服务的应用
PHP 曾是Web开发领域佼佼者,随着业务壮大,异步和高并发方面不足显现。Swoole 曾经尝试填补空白,但局限性也比较的明显。Go 语言的崛起,简洁语法和并发优势吸引大厂使用,吸引了大多数程序员的转型。
1110 0
Swoole与Go系列教程之HTTP服务的应用