iris虽然号称宇宙最快且支持mvc结构,不过用的人好像没有gin多呀。这里我默认你已经会了mvc的搭建方式(不懂可以看框架搭建二),因此只贴controller的代码。
先贴一个处理错误的私有方法⬇,等等看到d.checkErr(err)就是调用了这个
type DataController struct {
Ctx iris.Context
}
func (d *DataController) checkErr(err error) {
if err != nil {
d.Ctx.JSON(iris.Map{
"success": false,
"data": nil,
})
panic(err)
}
}
在GET请求中想要传参最常见的就是url上加参数的方式了
iris上接收GET请求并获取url传参⬇
//url:http://localhost:8080/data/query
//method:GET
//接收GET请求url上的param
//返回json
func (d *DataController) GetQuery() {
//第一种,可以选择直接获取全部,但是要注意这边会将其全部转换为string类型
//除非你全部都是string,不然还是要自己一个个取出来转值
urlParams := d.Ctx.URLParams()
//返回json类型的数据
d.Ctx.JSON(iris.Map{
"success": true,
"data": urlParams,
})
//第二种,一个个分别取值,类型自己掌控
anime := d.Ctx.URLParam("anime")
number, err := d.Ctx.URLParamInt("number")
d.checkErr(err)
d.Ctx.JSON(iris.Map{
"success": true,
"data": iris.Map{"anime": anime, "number": number},
})
}
请求中Headers里的Content-Type:multipart/form-data
iris上接收POST请求并获取multipart/form-data类型参数⬇
//url:http://localhost:8080/data/form
//method:POST
//接收POST请求,获取Content-Type为multipart/form-data的内容内有文件
//返回json
func (d *DataController) PostForm() {
//获取文件,文件头,可能的错误
imageFile, imageFileHeader, err := d.Ctx.FormFile("head-img")
d.checkErr(err)
annotation := d.Ctx.FormValue("annotation")
imageBytes := make([]byte, 1)
_, err = imageFile.Read(imageBytes)
d.checkErr(err)
//将文件写入./views/image/内,同名会覆盖,这里仅做演示,对于文件读写的详细操作可以看我的文章。
ioutil.WriteFile("./views/image/"+imageFileHeader.Filename, imageBytes, 0777)
d.Ctx.JSON(iris.Map{
"success": true,
"data": iris.Map{
"imageBytes": imageBytes,
"imageHeader": imageFileHeader,
"annotation": annotation,
},
})
}
在Postman上测试url:http://localhost:8080/data/form
后端
可以看的出来文件处理的很完美,依旧是那么的高清可爱!!
iris上接收POST请求并获取multipart/form-data类型参数。
需要注意的是Ctx.FormValues()这个参数也能够获取url上的参数,因此如果你只想要单单获取url的参数需要使用URLParams()。
//url:http://localhost:8080/data/form2
//method:POST
//接收POST请求,获取Content-Type为multipart/form-data的内容,无文件
//返回json
func (d *DataController) PostForm2() {
//和URLParams()类似,都是将其中的内容全部转换为string
//如果里面有不能转换的内容比如文件,将会把这个参数忽略掉
formMap := d.Ctx.FormValues()
isBest, err := strconv.ParseBool(formMap["isBest"][0])
d.checkErr(err)
number := make([]int64, len(formMap["number"]))
for i, value := range formMap["number"] {
number[i], err = strconv.ParseInt(value, 10, 32)
d.checkErr(err)
}
d.Ctx.JSON(iris.Map{
"success": true,
"data": iris.Map{
"number": number,
"isBest": isBest,
"annotation": formMap["annotation"][0],
},
})
}
请求中Headers里的Content-Type:application/x-www-form-urlencoded,其内容用**&**分隔和url上传参差不多,都不能传文件,只不过一个把内容放在请求的url上,一个放进请求的body里。在这边后端的接收方式和上面的一样都是使用FormValue()/FormValues()方法。
//url:http://localhost:8080/data/form3
//method:POST
//接收POST请求,获取Content-Type为application/x-www-form-urlencoded的内容
//返回json
func (d *DataController) PostForm3() {
//和URLParams()类似,都是将其中的内容全部转换为string
//如果里面有不能转换的内容比如文件,将会把这个参数忽略掉
formMap := d.Ctx.FormValues()
isBest, err := strconv.ParseBool(formMap["isBest"][0])
d.checkErr(err)
number := make([]int64, len(formMap["number"]))
for i, value := range formMap["number"] {
number[i], err = strconv.ParseInt(value, 10, 32)
d.checkErr(err)
}
d.Ctx.JSON(iris.Map{
"success": true,
"data": iris.Map{
"number": number,
"isBest": isBest,
"anime": d.Ctx.FormValue("anime"),
},
})
}
可以看的出来FormValues()是可以接收url上的参数的⬇(注意url)
主要有xml,json,并且接收什么类型我也会相应的返回对应类型。
先来手最常用的json,正常来讲就是自定义结构体来接收了,不过如果结构体内值类型都相同,也可以使用map[type]type来接收。
//url:http://localhost:8080/data/raw/json
//method:POST
//接收POST请求,获取Content-Type为application/json的内容
//返回json
func (d *DataController) PostRawJson() {
type anime struct {
Name string
Number int
IsBest bool
}
animeStruct := new(anime)
//如果全都是一个类型也可以不适用结构体改为map[type]type代替更为方便
err := d.Ctx.ReadJSON(animeStruct)
d.checkErr(err)
d.Ctx.JSON(iris.Map{
"success": true,
"data": animeStruct,
})
}
使用postman测试url:http://localhost:8080/data/raw/json
xml的实现感觉有点麻烦,我也不知道有没有更简单的方式,不过这边实现虽然麻烦不过该有的什么标签属性,多级标签我也都是很完美的接收到了。
//url:http://localhost:8080/data/raw/xml
//method:POST
//接收POST请求,获取Content-Type为application/xml的内容
//返回xml
func (d *DataController) PostRawXml() {
//因为底下父结构体有为其设置xml因此就不需要设置xml.Name
type Note struct {
//XMLName xml.Name `xml:"note"`
Type string `xml:"type,attr"` //attr属性。
To string `xml:"to"`
From string `xml:"from"`
Heading string `xml:"heading"`
Body string `xml:"body"`
}
type EmailXml struct {
//设置根元素名
XMLName xml.Name `xml:"content"`
Note Note `xml:"note"`
Version string `xml:"version"`
}
bangEmail := new(EmailXml)
//读取xml
d.Ctx.ReadXML(bangEmail)
//返回xml
d.Ctx.XML(bangEmail)
}
使用postman测试url:http://localhost:8080/data/raw/xml
先来说一下基本规则。
说再多不如举几个例子⬇
//method:Post
//url:http://localhost:8080/data/name/xxx string
//返回html
func (d *DataController) PostNameBy(name string) {
d.Ctx.HTML(""
+ name + "是最好看的动漫!")
}
//method:Put
//url:http://localhost:8080/data/name/xxx string/id/xxx uint64
//返回text
func (d *DataController) PutNameByIdBy(name string, id uint64) {
d.Ctx.WriteString(name + "修改为第" + string(id) + "好看的动漫")
}
//method:Delete
//url:http://localhost:8080/data/name/xxx int64
//返回text
func (d *DataController) DeleteNameBy(id int64) {
d.Ctx.Writef("删除id为%d的用户", id)
}
使用Postman测试Post:http://localhost:8080/data/name/街角魔族
使用Postman测试Put:http://localhost:8080/data/name/街角魔族/id/1
使用Postman测试Put:http://localhost:8080/data/name/街角魔族/id/-1,状态码404找不到资源,-1无法转换为uint64。
使用Postman测试Delete:http://localhost:8080/data/name/-1
以上结束。