前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go http 分析

go http 分析

作者头像
solate
发布2019-07-22 17:31:34
5410
发布2019-07-22 17:31:34
举报
文章被收录于专栏:solate 杂货铺solate 杂货铺

原生http

http.ListenAndServe

handler 参数(w http.ResponseWriter, r *http.Request)

go参数传递为值传递,request长用来获取参数等,所以直接传递指针比较好,而 ResponseWriter 是个接口,只要实现接口就行 无所谓传不传指针的问题。

代码语言:javascript
复制
package main

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

func main() {

	http.Handle("/", sayHello)

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

func sayHello(w http.ResponseWriter, r *http.Request)  {
	io.WriteString(w, "hello world, version 1")
}



//访问 http://localhost:8080/

http.ServeMux 更底层路由设置

http.ServeMux解析

ServeMux 其实是路由表,主要使用map结构,其实例必须实现 ServeHTTP() 方法

mux.m[pattern] = muxEntry{explicit: true, h: handler, pattern: pattern}

代码语言:javascript
复制
package main

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

func main() {

	mux := http.NewServeMux() //路由表结构
	mux.Handle("/", &MyHandler{}) //这里注册的是处理的指针,默认根路径"/"
	mux.HandleFunc("/hello", sayHello) //注册/hello 

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


type MyHandler struct {
	
}

func (_ * MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)  {
	io.WriteString(w, "URL: " + r.URL.String() )
}

func sayHello(w http.ResponseWriter, r *http.Request)  {
	io.WriteString(w, "hello world, version 2")
}


//访问 http://localhost:8080/
//访问 http://localhost:8080/hello

更进一步实现http.Server

自己实现Server 最重要的是需要自己在 ServeHTTP() 中实现路由转发

代码语言:javascript
复制
package main

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

var mux map[string]func(w http.ResponseWriter, r *http.Request)

func main() {

	server := http.Server{
		Addr : ":8080", //设置地址
		Handler : &MyHandler{}, //设置处理handler
		ReadTimeout : 5 * time.Second, //设置超时时间 5S
	}

	//因为没有提供方法,所以需要自己实现路由,然后在ServeHTTP中进行路由转发
	mux = make(map[string]func(w http.ResponseWriter, r *http.Request))
	mux["/hello"] = sayHello
	mux["/bye"] = sayBye

	err := server.ListenAndServe() // 使用自己实例化的server
	if err != nil {
		log.Fatal(err)
	}
}

type MyHandler struct {

}

func (_ *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	//因为这里没有方法,所以需要进行路由转发
	if h, ok := mux[r.URL.String()]; ok {
		h(w, r) //如果存在就转发
		return
	}
	io.WriteString(w, "URL: " + r.URL.String())
}

func sayHello(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, "hello world, version 3")
}

func sayBye(w http.ResponseWriter, r *http.Request) {
	io.WriteString(w, "bye bye, version 3")
}


//访问 http://localhost:8080/
//访问 http://localhost:8080/hello
//访问 http://localhost:8080/bye

静态文件

静态文件就需要使用到http.FileServer

使用Golang 搭建http web服务器

代码语言:javascript
复制
package main

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

func main() {

	mux := http.NewServeMux()
	mux.Handle("/", &MyHandler{})
	mux.HandleFunc("/hello", sayHello)

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

	//http.Dir(wd) //获取相对路径
	//http.FileServer 静态处理
	mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(wd)))) //设置静态文件路径

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


type MyHandler struct {

}

func (_ * MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)  {
	io.WriteString(w, "URL: " + r.URL.String() )
}

func sayHello(w http.ResponseWriter, r *http.Request)  {
	io.WriteString(w, "hello world, version 4")
}



// http://localhost:8080/static/
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原生http
    • http.ListenAndServe
      • http.ServeMux 更底层路由设置
        • 更进一步实现http.Server
          • 静态文件
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档