golang beego使用记录

beego 简介

beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。

beego 的安装

1
go get github.com/beego/beego/v2

bee 工具简介

bee 工具是一个为了协助快速开发 beego 项目而创建的项目,通过 bee 您可以很容易的进行 beego 项目的创建、热编译、开发、测试、和部署。

bee 工具的安装

1
go get -u github.com/beego/bee/v2

安装完之后,bee 可执行文件默认存放在 $GOPATH/bin 里面,所以您需要把 $GOPATH/bin 添加到您的环境变量中,才可以进行下一步。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Bee is a Fast and Flexible tool for managing your Beego Web Application.

Usage:

bee command [arguments]

The commands are:

version show the bee & beego version
migrate run database migrations
api create an api application base on beego framework
bale packs non-Go files to Go source files
new create an application base on beego framework
run run the app which can hot compile
pack compress an beego project
fix Fixes your application by making it compatible with newer versions of Beego
dlv Start a debugging session using Delve
dockerize Generates a Dockerfile for your Beego application
generate Source code generator
hprose Creates an RPC application based on Hprose and Beego frameworks
pack Compresses a Beego application into a single file
rs Run customized scripts
run Run the application by starting a local development server
server serving static content over HTTP on port

Use bee help [command] for more information about a command.

详细参考:https://beego.me/docs/install/bee.md

beego 返回 json 响应

需要注意的是 json 结构体里面的字段必须是大写字母开头,否则是不会返回的。

1
2
3
4
5
6
7
8
type person struct {
Name string `json:"name"`
Age int `json:"age"`
}

type JsonResponse1 struct {
Data [2]person `json:"data"`
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package controllers

import (
"github.com/astaxie/beego"
)

type LoggerController struct {
beego.Controller
}

type person struct {
Name string `json:"name"`
Age int `json:"age"`
}

type JsonResponse struct {
Data []person `json:"data"`
}

func (c *LoggerController) Get() {
var jsonResponse JsonResponse

var persons []person
persons = append(persons, person{"awks", 23})
persons = append(persons, person{"ruby", 25})
jsonResponse.Data = persons
c.Data["json"] = &jsonResponse

c.ServeJSON()
}

Beego框架:表单数据验证

git地址:https://github.com/go-playground/validator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
StructTag 可用的验证函数:

Required 不为空,即各个类型要求不为其零值
Min(min int) 最小值,有效类型:int,其他类型都将不能通过验证
Max(max int) 最大值,有效类型:int,其他类型都将不能通过验证
Range(min, max int) 1 <= * <= 140,超出此范围即为不合法
MinSize(min int) 最小长度,有效类型:string,slice,其他类型都将不能通过验证
MaxSize(max int) 最大长度,有效类型:string,slice,其他类型都将不能通过验证
Length(length int) 指定长度,有效类型:string,slice,其他类型都将不能通过验证
Alpha
Numeric 数字,有效类型:string,其他类型都将不能通过验证
AlphaNumeric alpha字符或数字,有效类型:string,其他类型都将不能通过验证
Match(pattern string)正则匹配,有效类型:string,其他类型都将被转成字符串再匹配(fmt.Sprintf(“%v”, obj).Match)
AlphaDash
Email
IP IP 格式,目前只支持 IPv4格式验证,有效类型:string,其他类型都将不能通过验证
Base64 base64编码,有效类型:string,其他类型都将不能通过验证
Mobile
Tel固定电话号,有效类型:string,其他类型都将不能通过验证
Phone手机号或固定电话号,有效类型:string,其他类型都将不能通过验证
ZipCode邮政编码,有效类型:string,其他类型都将不能通过验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main

import (
"log"
"strings"

"github.com/beego/beego/v2/core/validation"
)

// 验证函数写在 "valid" tag 的标签里
// 各个函数之间用分号 ";" 分隔,分号后面可以有空格
// 参数用括号 "()" 括起来,多个参数之间用逗号 "," 分开,逗号后面可以有空格
// 正则函数(Match)的匹配模式用两斜杠 "/" 括起来
// 各个函数的结果的 key 值为字段名.验证函数名
// label 指定字段别名
type user struct {
Id int
Name string `valid:"Required;Match(/^Bee.*/)"` // Name 不能为空并且以 Bee 开头
Age int `valid:"Range(1, 140)"` // 1 <= Age <= 140,超出此范围即为不合法
Email string `valid:"Email; MaxSize(100)"` // Email 字段需要符合邮箱格式,并且最大长度不能大于 100 个字符
Mobile string `valid:"Mobile;"` // Mobile 必须为正确的手机号
IP string `valid:"IP" label:"srcIp"` // IP 必须为一个正确的 IPv4 地址,
}

// 如果你的 struct 实现了接口 validation.ValidFormer
//当 StructTag 中的测试都成功时,将会执行 Valid 函数进行自定义验证
func (u *user) Valid(v *validation.Validation) {
if strings.Index(u.Name, "admin") != -1 {
// 通过 SetError 设置 Name 的错误信息,HasErrors 将会返回 true
v.SetError("Name", "名称里不能含有 admin")
}
}

func main() {
valid := validation.Validation{}
u := user{Name: "Beego", Age: 2, Email: "dev@beego.me"}
//valid.Required()
b, err := valid.Valid(&u)
if err != nil {
// handle error
}
if !b {
// validation does not pass
// blabla...
for _, err := range valid.Errors {
log.Println(err.Key, err.Message)
}
}
}

//2021/03/07 12:14:21 Mobile.Mobile. Mobile Must be valid mobile number
//2021/03/07 12:14:21 IP.IP.srcIp srcIp Must be a valid ip address

beego httplib

httplib简单使用

1
2
3
4
5
6
req := httplib.Get("http://beego.me/")
str, err := req.String()
if err != nil {
t.Fatal(err)
}
fmt.Println(str)

支持的请求方法

1
2
3
4
5
Get(url string)
Post(url string)
Put(url string)
Delete(url string)
Head(url string)

支持超时

1
2
req.SetTimeout(connectTimeout, readWriteTimeout)
httplib.Get("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second

设置请求参数

  • 方法一
1
2
3
req := httplib.Post("http://beego.me/")
req.Param("username","astaxie")
req.Param("password","123456")
  • 方法二
1
2
3
4
req := httplib.Post("http://127.0.0.1:9999")
req.JSONBody(map[string]interface{}{"jsonrpc":"2.0","method":"eth_blockNumber","id":83})
var js interface{}
req.ToJSON(&js)
  • 方法三 发送大片的数据
1
2
3
4
5
6
req := httplib.Post("http://beego.me/")
bt,err:=ioutil.ReadFile("hello.txt")
if err!=nil{
log.Fatal("read file err:",err)
}
req.Body(bt)

设置header信息

1
2
3
req := httplib.Post("http://beego.me/")
req.Header("Accept-Encoding","gzip,deflate,sdch")
req.Header("Host","beego.me")

直接上传文件

1
2
3
4
5
6
7
8
9
10
PostFile 第一个参数是 form 表单的字段名,第二个是需要发送的文件名或者文件路径
b:=httplib.Post("http://beego.me/")
b.Param("username","astaxie")
b.Param("password","123456")
b.PostFile("uploadfile1", "httplib.pdf")
b.PostFile("uploadfile2", "httplib.txt")
str, err := b.String()
if err != nil {
t.Fatal(err)
}

获取返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 返回 Response 对象,req.Response() 方法
这个是 http.Response 对象,用户可以自己读取 body 的数据等。

2. 返回 bytes,req.Bytes() 方法
直接返回请求 URL 返回的内容

3. 返回 string,req.String() 方法
直接返回请求 URL 返回的内容

4. 保存为文件,req.ToFile(filename) 方法
返回结果保存到文件名为 filename 的文件中

5. 解析为 JSON 结构,req.ToJSON(&result) 方法
返回结构直接解析为 JSON 格式,解析到 result 对象中

6. 解析为 XML 结构,req.ToXml(&result) 方法
返回结构直接解析为 XML 格式,解析到 result 对象中
-------------本文结束感谢您的阅读-------------