# puffer
**Repository Path**: termites/puffer
## Basic Information
- **Project Name**: puffer
- **Description**: 使用Go原生net/http工具包编写的web快速开发框架
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-06-06
- **Last Updated**: 2022-06-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: WEB框架, Go语言
## README
# Puffer
### 简体中文 [English](./README.md)
#### 一、介绍
puffer 是一款快速、简洁的Go Web框架,使用极少的代码来开发高性能的Web应用程序,框架遵循Go的编程思量,零入侵。
框架专注于web服务处理,其他工具使用组件或者中间件进行集成
#### 二、安装教程
##### 1、go get 安装
```shell
go get -u -v github.com/druidcaesa/puffer
```
#### 2、go mod 安装
```shell
require github.com/druidcaesa/puffer
```
#### 3、go版本显示
```shell
go >=1.15
```
#### 三、使用说明
##### 1、快速开始
- 编写代码
```go
package main
import (
"github.com/druidcaesa/puffer"
"net/http"
)
func main() {
//快速创建启动服务
server := puffer.New()
//注册路由,第二个参数是一个函数
server.GET("/hello", func(c *puffer.Context) {
c.String(http.StatusOK, "hello %s, you're at %s\n", c.Query("name"), c.Path)
})
//监听端口
server.Run(":8080")
}
```
- 请求结果
```shell
curl "http://127.0.0.1:8080/hello"
hello , you're at /hello
```
- 就这么简单一个简单基础服务搭建完毕
##### 2、路由
###### 1、静态路由
```go
package main
import (
"github.com/druidcaesa/puffer"
"net/http"
)
func main() {
r := puffer.New()
r.GET("/", func(c *puffer.Context) {
c.HTML(http.StatusOK, "
Hello Puffer
")
})
r.GET("/hello", func(c *puffer.Context) {
c.String(http.StatusOK, "hello %s, you're at %s\n", c.Query("name"), c.Path)
})
r.Run(":8080")
}
```
###### 2、动态路由
```go
package main
import (
"github.com/druidcaesa/puffer"
"net/http"
)
func main() {
//快速创建启动服务
server := puffer.New()
//一级路由
server.GET("/hello/:name", func(c *puffer.Context) {
c.String(http.StatusOK, "hello %s, you're at %s\n", c.Param("name"), c.Path)
})
//多级路由测试
server.GET("/assets/*filepath", func(c *puffer.Context) {
c.JSON(http.StatusOK, puffer.H{"filepath": c.Param("filepath")})
})
//监听端口
server.Run(":8080")
}
```
###### 3、分组路由
```go
package main
import (
"github.com/druidcaesa/puffer"
)
func main() {
//快速创建启动服务
server := puffer.New()
//正常路由
server.GET("/login", login)
//分组路由
v1 := server.Group("/v1")
{
v1.GET("/getInfo", getInfo)
}
}
func getInfo(context *puffer.Context) {
}
func login(context *puffer.Context) {
}
```
```shell
2022/06/07 16:01:55 Route GET - /login
2022/06/07 16:01:55 Route GET - /v1/getInfo
```
##### 3、参数获取
###### 1、GET请求参数
```go
package main
import (
"fmt"
"github.com/druidcaesa/puffer"
)
//用户获取get参数,必须使用tag form
type Query struct {
Name string `form:"name"`
}
func main() {
//快速创建启动服务
server := puffer.New()
//正常路由
server.GET("/login", login)
//分组路由
v1 := server.Group("/v1")
{
v1.GET("/getInfo", getInfo)
}
server.Run(":8080")
}
func getInfo(c *puffer.Context) {
q := new(Query)
_, err := c.BindQuery(q)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("获取前端传的参数%s", q.Name)
}
func login(context *puffer.Context) {
}
```
###### 2、POST请求的body 体的JSON数据
```go
package main
import (
"fmt"
"github.com/druidcaesa/puffer"
"net/http"
)
//用户获取get参数,必须使用tag form
type Query struct {
Name string `form:"name"`
}
type JSON struct {
UserName string `json:"userName"`
}
func main() {
//快速创建启动服务
server := puffer.New()
//正常路由
server.POST("/login", login)
//分组路由
v1 := server.Group("/v1")
{
v1.GET("/getInfo", getInfo)
}
server.Run(":8080")
}
func getInfo(c *puffer.Context) {
q := new(Query)
_, err := c.BindQuery(q)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("获取前端传的参数%s", q.Name)
}
func login(c *puffer.Context) {
j := new(JSON)
_, err := c.BindJsonBody(j)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("获取前端传的参数%s", j.UserName)
c.JSON(http.StatusOK, puffer.H{
"data": j,
})
}
```

###### 3、获取表单提交数据
```go
package main
import (
"github.com/druidcaesa/puffer"
"log"
"net/http"
)
func main() {
engine := puffer.Default()
engine.POST("/testForm", func(c *puffer.Context) {
//获取表单提交数据
userName := c.GetPostForm("userName")
log.Printf("表单提交数据为------->%s",userName)
c.JSON(http.StatusOK,puffer.H{
"message": userName,
})
})
engine.Run(":8080")
}
```
```shell
2022/06/08 09:31:09 表单提交数据为------->张三
2022/06/08 09:31:09 [200] /testForm in 100.905µs
```
###### 4、文件上传
```go
package main
import (
"github.com/druidcaesa/puffer"
"log"
)
func main() {
engine := puffer.Default()
engine.POST("/upload", func(c *puffer.Context) {
file, err := c.FormFile("file")
if err != nil {
return
}
log.Printf("获取到的文件名称--------------->%s",file.Filename)
log.Printf("获取到的文件大小--------------->%d",file.Size)
log.Printf("获取到的文件类型--------------->%T",file.File)
})
engine.Run(":8080")
}
```
````shell
2022/06/08 09:34:01 Route POST - /upload
2022/06/08 09:34:29 获取到的文件名称--------------->monkey-admin.sql
2022/06/08 09:34:29 获取到的文件大小--------------->40011
2022/06/08 09:34:29 获取到的文件类型--------------->*multipart.File
````
##### 4、中间件
###### 1、创建中间件
```go
/**
@author: fanyanan
@date: 2022/6/7
@note: //日志中间件
**/
package middlewares
import (
"github.com/druidcaesa/puffer"
"log"
"time"
)
func Logger() puffer.HandlerFunc {
return func(c *puffer.Context) {
//start time
t := time.Now()
//Middleware processing logic
log.Printf("[Status:%d] %s in %v", c.StatusCode, c.Req.RequestURI, time.Since(t))
//Pass to the next middleware
c.Next()
}
}
```
###### 2、中间件注册
```go
package main
import (
"fmt"
"github.com/druidcaesa/puffer"
"net/http"
"web-demo/middlewares"
)
//用户获取get参数,必须使用tag form
type Query struct {
Name string `form:"name"`
}
type JSON struct {
UserName string `json:"userName"`
}
func main() {
//快速创建启动服务
server := puffer.New()
//注册全局中间件
server.Use(middlewares.Logger())
//分组路由
v1 := server.Group("/v1")
{
v1.GET("/getInfo", getInfo)
}
server.Run(":8080")
}
func getInfo(c *puffer.Context) {
q := new(Query)
_, err := c.BindQuery(q)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("获取前端传的参数%s", q.Name)
}
```
