文档章节

go http 分析

solate
 solate
发布于 2016/09/14 11:30
字数 607
阅读 162
收藏 1

原生http

http.ListenAndServe

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

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

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}


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() 中实现路由转发


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服务器


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/

© 著作权归作者所有

solate
粉丝 10
博文 134
码字总数 119760
作品 0
成都
程序员
私信 提问
【收藏】数据分析必备神器

数据可视化工具 百度ECharts:http://http://echarts.baidu.com/ Cytoscape:http://An Open Source Platform for Complex Network Analysis and Visualization 图表秀:http://图表秀--免......

Data Analyst
2017/04/21
0
0
图和网络分析重要库

网络分析算法库,能高效解决网络分析问题,本文介绍网络分析相关的开源库。 这些算法库主要包含: BGL(Boost Graph Library)是比较经典C++图算法库,内容丰富,高效稳定(见参考1)。Pgrou...

SibylY
2016/04/14
110
0
浙江大学软件工程实验室关于Docker和KUBERNETES的分析文章

DOCKER源码分析(一):DOCKER架构, 2014.12.02, http://www.sel.zju.edu.cn/?p=112 DOCKER源码分析(二):DOCKER CLIENT创建与命令执行, 2014.12.02, http://www.sel.zju.edu.cn/?p=147 DO......

一配
2015/08/30
2.3K
1
使用tcpdump+wireshark抓包分析网络数据包

最近和学弟在调试一个GPRS通信模块,需求是通过GPRS模块通过http协议发送数据到服务器,但是http协议一直失败,服务器返回400,通过查询http状态码得知,http400错误是请求无效,因为GPRS模块没有实...

紫葡萄0
2018/12/16
0
0
OneAlert 入门(三)——事件分析

OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性。有了 OneAlert,你可以更快更合理地为事件划分优先级、分...

OneAPM蓝海讯通
2016/01/22
38
0

没有更多内容

加载失败,请刷新页面

加载更多

分享一个 pycharm 专业版的永久使用方法

刚开始接触Python,首先要解决的就是Python开发环境的搭建。 目前比较好用的Python开发工具是PyCharm,他有社区办和专业版两个版本,但是社区版支持有限,我们既然想好好学python,那肯定得用...

上海小胖
27分钟前
4
0
Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情

0 相关源码 1 什么是Spring Boot 一个快速开发的脚手架 作用 快速创建独立的、生产级的基于Spring的应用程序 特性 无需部署WAR文件 提供starter简化配置 尽可能自动配置Spring以及第三方库 ...

JavaEdge
今天
7
0
TensorFlow 机器学习秘籍中文第二版(初稿)

TensorFlow 入门 介绍 TensorFlow 如何工作 声明变量和张量 使用占位符和变量 使用矩阵 声明操作符 实现激活函数 使用数据源 其他资源 TensorFlow 的方式 介绍 计算图中的操作 对嵌套操作分层...

ApacheCN_飞龙
今天
8
0
五、Java设计模式之迪米特原则

定义:一个对象应该对其他对象保持最小的了解,又叫最小知道原则 尽量降低类与类之间的耦合 优点:降低类之间的耦合 强调只和朋友交流,不和陌生人说话 朋友:出现在成员变量、方法的输入、输...

东风破2019
昨天
25
0
jvm虚拟机结构

1:jvm可操作数据类型分为原始类型和引用类型,因此存在原始值和引用值被应用在赋值,参数,返回和运算操作中,jvm希望在运行时 明确变量的类型,即编译器编译成class文件需要对变量进行类型...

xpp_ba
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部