路由进阶与目录架构 === 1.今天课程第一部分就是先把,上节课路由没有将完的将完 2.第二部分是就目录结构将来 后面两节课程的计划是golang操作mysql 然后在做一个登录登出的小案例,自己实现session ***** 1.路由序章 - get 接收数据 - post 接收数据 get数据接收 ``` // url: http:127.0.0.1:8085/name/:name // p httprouter.Params 可以通过 p.ByName("name") 来获取值 // 现在我们来编译测试一下吧 func Name(w http.ResponseWriter,r *http.Request,p httprouter.Params) { name := p.ByName("name") w.Write([]byte("you name:"+name)) } // url: get http:127.0.0.1:8085/registeredusers // 演示get请求获取数据 func RegisteredUsersGet(w http.ResponseWriter,r *http.Request,p httprouter.Params) { r.ParseForm() // 解析url传递的参数,对于POST则解析响应包的主体(request body) // 注意:如果没有调用ParseForm方法,下面无法获取表单的数据 name := r.Form["name"] password := r.Form["password"] // 这里获取到的是[]string if len(name)==0 || len(password)==0 { // 如果没有传入 就访问这个url 处理 // 这里我先不封装,后面的课程会讲分离 // RESTful知道吧 参数异常返回400 w.WriteHeader(http.StatusBadRequest) //设置返回状态码 w.Write([]byte("参数没有传,你干撒呢!")) return } w.Write([]byte("name: "+name[0]+" password: "+password[0])) // 此处小朋友会疑惑吗name[0] 接收的参数为什么是[]string /** 我来解释 用postman测试,提交http://localhost:8080/?uid=111 服务端输出 :[111] 提交: http://localhost:8080/?uid=111&uid=222 服务端输出:[111 222] */ } ``` post 数据接收 ``` // url: post http:127.0.0.1:8085/registeredusers // 演示post请求获取数据 func RegisteredUsersPOST(w http.ResponseWriter,r *http.Request,p httprouter.Params) { /** 注意.Form r.Form包含了GET、POST参数 POST:为 application/x-www-form-urlencoded 提交的蛤 */ r.ParseForm() name := r.Form["name"] password := r.Form["password"] if len(name) == 0 || len(password) == 0 { w.WriteHeader(http.StatusBadRequest) w.Write([]byte("参数!")) return } w.Write([]byte("name: "+name[0]+" password: "+password[0])) } ``` 这里要注意一下json提交的上一中post是接收不了的 ### 现在这个把他整个目录都重新架构一遍 ``` . ├── auth 鉴权层 │   └── auth.go ├── dbops 数据库操作 ├── defs 数据体定义 ├── go.mod ├── go.sum ├── LICENSE ├── main.go ├── response 处理返回 │   └── response.go ├── router 路由层 │   ├── handlers.go │   └── router.go ├── session session处理 └── utils 工具类 ``` 现在吧那个返回封装一下 在defs下创建err.go err相关返回定义 ``` package defs import "net/http" type Err struct { Error string `json:"error"` //这是打tag ErrorCode string `json:"error_code"` } type ErrResponse struct { HttpSc int Error Err } // 定义常用返回信息 var ( // 定义参数错误返回类型 ErrorRequestBodyParseFailed = ErrResponse{Error:Err{Error:"Request body is not correct",ErrorCode:"001"},HttpSc:http.StatusBadRequest} ) ``` 定义request下的request.go ``` package response import ( "GolangWebCourseware/defs" "encoding/json" "net/http" ) // 当返回错误信息时 func sendErrorResponse(w http.ResponseWriter,errResp defs.ErrResponse) { w.WriteHeader(errResp.HttpSc) bytes, _ := json.Marshal(errResp.Error) w.Write(bytes) } ``` 然后直接就可以这样写了 ``` // url: post http:127.0.0.1:8085/registeredusers // 演示post请求获取数据 func RegisteredUsersPOST(w http.ResponseWriter,r *http.Request,p httprouter.Params) { /** 注意.Form r.Form包含了GET、POST参数 POST:为 application/x-www-form-urlencoded 提交的蛤 */ r.ParseForm() name := r.Form["name"] password := r.Form["password"] if len(name) == 0 || len(password) == 0 { response.SendErrorResponse(w,defs.ErrorRequestBodyParseFailed) return } w.Write([]byte("name: "+name[0]+" password: "+password[0])) } ``` 好了现在处理最后一步,接收json数据 1.第一步建立当前接收json数据的结构体 ``` package defs type user struct { name string `json:"name"` password string `json:"password"` } ``` 2.读body然后序列化 ``` // url: post http:127.0.0.1:8085/rpjson func RegisteredUsersPOSTByJSON(w http.ResponseWriter,r *http.Request,p httprouter.Params) { //读取body 这里就用ioutil包吧,这个没有包含文件不会太大 bytes, _ := ioutil.ReadAll(r.Body) // 创建一个用户接收数据的空对象 userinfo := &defs.User{} //序列化 err := json.Unmarshal(bytes, userinfo) if err != nil { response.SendErrorResponse(w,defs.ErrorRequestBodyParseFailed) return } fmt.Println(userinfo) w.Write(bytes) } ``` 本次课程代码: [https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B7%AF%E7%94%B1%E8%BF%9B%E9%98%B6%E4%B8%8E%E7%9B%AE%E5%BD%95%E6%9E%B6%E6%9E%84](https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B7%AF%E7%94%B1%E8%BF%9B%E9%98%B6%E4%B8%8E%E7%9B%AE%E5%BD%95%E6%9E%B6%E6%9E%84) OK,golang是不是非常的爽啊!,如此优雅! 下一刻 golang操作mysql ***** ### 接受数据推荐这个: - post ``` func RegisteredUsersPOST(w http.ResponseWriter,r *http.Request,p httprouter.Params) { r.ParseForm() r.PostForm.Get("key") } ``` - get ``` query := r.URL.Query() uid := query["uid"][0] fmt.Println(uid) ```