路由基础net/http的学习 === 有tp或者其他web基础的同学都知道路由这东西吧, 你看现在路由器的地址栏上的http://.....这些就路由 每一个路由对应不同的页面 好的我们现在就来写吧 ***** 1.基础准备,配置golang 环境这些我就不必多说了吧 2.我们本次开发用到的IDE为golang这个安装和新建一个项目,我也不必多说了吧 3.新建一个main.go ``` package main import ( "fmt" "net/http" ) func main() { /* 这个是创建一个路由 路由地址 /hello 接收两个参数 第一个为response 第二个是request (注:request 为什么是指针? 这个golang默认是值传递,如果你写 request http.Request 这样接收的参数是传递的副本拷贝的 这个是golang基础不懂的话去看官方文档啊~!) writer.Write() response返回 要求是[]byte so你要转一下 好的 现在编译一下吧 运行下吧 go build . 然和通过浏览器 访问 http://127.0.0.1:8085/hello */ // url: http://127.0.0.1:8085/hello http.HandleFunc("/hello", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("Hello GOlang")) }) fmt.Println("server is runing ...") err := http.ListenAndServe(":8085", nil) //第一个是地址(ip:端口 ip可以省略 监听本机全部端口) 第二个是handler if err != nil { fmt.Println("server error:",err.Error()) } } ``` ![](https://box.kancloud.cn/66165a7bddd7207664c5cdf0be880f76_1920x1052.png) 哈哈golang写网页是不是非常简单的 如果对上面几个方法有不懂的地方 去官网看看golang net/http的库 ### httprouter讲解 好了大家现在发现没有 第一章我让大家去了解下RESTful api 刚刚上面的例子 get post .. 都可以请求到 现在我就给大家讲一个httproter 库 为net/http的升级版 大家应该听过大名鼎鼎的git框架吧 他的路由实现就是靠 httproter实现的 1.第一步获得httproter ``` go get github.com/julienschmidt/httprouter ``` (还是推荐使用vgo做管理,有想法的同学可以去看看蛤) 现在我们已经获取了,现在就来改造一下我们的demo吧 等等刚刚还忘了说一个问题,如果所有的路由都在main方法里面写,最后来main是不是非常的大啊! 好的,现在我们就来用httproter顺便解决这个问题吧 ``` package main import ( "fmt" "github.com/julienschmidt/httprouter" "net/http" ) /** 创建路由注册 */ func RegisterRouter() *httprouter.Router { router := httprouter.New() //得到router实例 //注册路由 // 路由后面可以跟.GET .POST .DELETE .PUT 等 (其他的怎么查看呢? 你按住ctrl 点赞 New()进入方法 看下面的代码 里面就是详情啊!) // 第一个你发觉参数有些不同的吗? 对 多了一个params httprouter.Params 这个用来接收路由中的参数 等会来讲 // 我们先看GET POST都指向同一个路径 but返回不同的内容, 怎么测试呢? 百度postman 这个是测试基础啊!百度学习吧骚年 非常简单的 router.GET("/", func(writer http.ResponseWriter, request *http.Request, params httprouter.Params) { writer.Write([]byte("this is get method")) }) router.POST("/", func(writer http.ResponseWriter, request *http.Request, params httprouter.Params) { writer.Write([]byte("this is post method")) }) return router } func main() { router := RegisterRouter() //注册路由 fmt.Println("server is runing ...") //这里发现改变了什么吗? //对第二次参数变成了router err := http.ListenAndServe(":8085", router) //第一个是地址(ip:端口 ip可以省略 监听本机全部端口) 第二个是handler if err != nil { fmt.Println("server error:",err.Error()) } } ``` 好了我们再来看params httprouter.Params是什么东西,顺便解决吧路由分开 1.创建router文件夹 2.在里面方两个文件一个是router.go 一个handlers.go ├── main.go ├── router 路由层 │   ├── handlers.go │   └── router.go 这样就完成了分离 是不是好看了许多啊! ![](https://box.kancloud.cn/8f9dacab0eeaa8a5aba53a117812c8ba_1912x923.png) 是不是很简单啊 我现在就吧当前的代码提交了吧,我去的github上看看吧,记住自己要练习啊! [https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B7%AF%E7%94%B1%E5%9F%BA%E7%A1%80](https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B7%AF%E7%94%B1%E5%9F%BA%E7%A1%80)