路由进阶与目录架构
===
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)
```
- 初认GOlang Web
- 关于环境配置
- 路由
- 路由进阶与目录架构
- 静态文件服务器
- 自定义Middleware
- 与MySQL起舞
- 主从模式概念
- 部署主从集群
- 分库分表
- 补充:事务
- 补充:常用SQL示例
- Template使用
- 一些小的,但是要知道的东西
- 调度任务
- 流控算法
- 鉴权
- JWT鉴权前置知识:加密解密
- session
- 文件上传与下载
- 带缓存读写拷贝io
- 参考
- 写好的文件上传
- 文件下载
- 拓展:秒传功能实现
- 扩展:分块上传和断点续传
- 扩展:分块上传
- 扩展:断点续传
- 扩展:分布式存储
- 部署ceph集群
- cephAuth
- go操作ceph集群
- 扩展:云存储
- go操作oss
- 补充:xorm框架
- 命令小结
- 补充:xorm框架高级部分
- 补充
- MongoDB
- 基础概念
- 简简单单NoSql
- 操作集合(Collection)
- 操作文档(Document)
- 带条件的文档 db.find
- 复杂条件抽文档 db.find
- redis
- redis操作
- go操作redis
- (新增)配置鉴权
- 密码学
- 文件校验算法
- 未来课程的安排
- RPC实践
- 爬虫
- 正则表达式
- 爬取手机号
- 爬取邮箱
- 爬取超链接
- 爬取身份证号
- 并发爬图片
- 扩展:CICD
- GO实现自动化部署系统
- 国际化支持
- 并发带来问题的解决
- GOWEB小知识
- Sync包讲解
- sync.Pool
- 千万级WebSocket消息推送
- 微服务入门:开篇
- 路由通讯
- RabbitMQ
- RabbitMQ工作原理和转发模式
- Dcoker 下 RabbitMQ and Ui
- Go操作RabbitMQ
- 初步微服务
- go-micro
- 补充:consul
- 快速入门
- 补充:consul超时
- 微服务架构
- 微服务架构全景图
- 服务注册和发现
- raft协议基本概念
- raft协议leader选举详解
- raft协议日志复制详解
- raft协议safefy详解
- rpc调用个服务监控
- etcd
- 命令行使用
- Golang操作etcd
- GO操作etcd OP方式 (分布式锁基础)
- etcd 分布式集群乐观锁
- (新增)鉴权
- 服务注册
- 服务发现原理
- 选项设计模式介绍
- 基于插件的注册组建
- 课前知识
- etcd注册开发1
- ffmpeg
- 2.0新的启航
- 高可用Mysql
- mysql逻辑架构
- 常见的MySQL高可用方案
- 索引
- MYSQL调优
- 什么影响了MYSQL的性能
- Mysql 服务器参数配置
- Go深入并发
- 基本同步原语
- 扩展同步原语
- 原子操作
- M P G 模型
- 简单的消息总线
- GoMicro入门
- GO任务池编写
- GO依赖注入
- 一些补充
- golang defer在什么时候执行
- 分布式理论篇(面试吹牛必备)
- CAP理论
- Raft协议
- 保证注册中心的可靠性
- 链路追踪
- 怎么实现强一致性