# 处理HTTP请求
# 1 数据请求方式的分类
所有的项目中使用的请求都遵循
HTTP
协议标准,HTTP
协议一共定义了八种方法用来对Request-URI
网络资源的不同操作方式。HTTP协议经过了1.0和1.1两个版本的发展。
HTTP1.0
定义了三种请求方法:GET
,POST
和HEAD
方法。HTTP1.1
新增了五种请求方法:OPTIONS
,PUT
,DELETE
,TRACE
和CONNECT
方法。
# 2 IRIS请求处理方式
处理方式概述
- 1、
Iris
框架中服务实例app
中包含多个方法,用来支持对上述HTTP
多种请求类型的直接处理,直接定义为get
方法、post
方法、put
方法等,app
中包含的自动处理路由请求的方法与http
请求类型的分类一致。 - 2、除了上述1中自动处理各类别的请求外,框架还支持使用通用的
Handle
方法来自定义编写自己的请求处理类型及对应的方法。
# 2.1 GET请求
向特定的网络资源数据发起请求。
GET
请求可以携带请求数据,携带的请求数据会以?
分割URL
和传输数据,参数之间以&
相连,比如http://localhost:8080/getUserInfo?username=admin&password=12345。 如下是一个http
的get
类型的请求示例:
package main
import (
"fmt"
"github.com/kataras/iris/v12"
)
func main() {
//创建一个app结构体指针对象
app := iris.New()
//url: http://localhost:8080/getUserInfo?username=admin&password=12345
//type:GET请求
//param:传递两个参数username、password
app.Get("/getUserInfo", func(context iris.Context) {
//获取请求的路径
path := context.Path()
//获取get请求传递过来的对应参数值
username := context.URLParam("username")
password := context.URLParam("password")
//在控制台打印获取的参数值
fmt.Println(username, password)
//在控制台打印路径
app.Logger().Info(path)
//在浏览器上打印
context.HTML("<h1>Hello World!!</h1>")
})
//8080 监听端口 ,如果未发现服务则返回系统自定义的错误
app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
}
------------------------------------输出结果-----------------------------------------
admin 12345
[INFO] 2020/01/07 23:00 /getUserInfo
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
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
# 2.2 POST请求
POST
请求在进行请求时会将请求数据放在请求body
中进行请求,请求数据大小没有限制。在开发过程中,我们使用postman
工具来进行POST
请求的调试。POST
请求的示例如下所示:
package main
import (
"fmt"
"github.com/kataras/iris/v12"
)
//定义接收json、xml数据的结构体
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
func main() {
//创建一个app结构体指针对象
app := iris.New()
//url: http://localhost:8080/postLogin
//type:POST请求
//param:form表单传递两个参数username、password
app.Post("/postLogin", func(context iris.Context) {
//获取请求的路径
path := context.Path()
//获取post请求传递过来的对应参数值
username := context.PostValue("username")
password := context.PostValue("password")
//在控制台打印获取的参数值
fmt.Println(username, password)
//在控制台打印路径
app.Logger().Info(path)
context.WriteString("hello "+username)
})
//url: http://localhost:8080/postJson
//type:POST请求
//param:json格式的请求数据
app.Post("/postJson", func(context iris.Context) {
//声明一个结构体用于接收json数据
var u1 User
//获取前端传递过来的json数据,放入到结构体中
err := context.ReadJSON(&u1)
if err != nil {
fmt.Printf("获取用户信息错误,err:%v\n", err)
}
//输出接收到的数据是:main.User{Username:"admin",Password:123456}
context.Writef("接收到的数据是:%#+v\n", u1)
//也可以返回json格式的数据
//context.JSON(iris.Map{"message": "hello word", "requestCode": 200})
})
//url: http://localhost:8080/postXml
//type:POST请求
//param:xml格式的请求数据
app.Post("/postXml", func(context iris.Context) {
//声明一个结构体用于接收xml数据
var u1 User
//获取前端传递过来的xml数据,放入到结构体中
err := context.ReadXML(&u1)
if err != nil {
fmt.Printf("获取用户信息错误,err:%v\n", err)
}
//输出接收到的数据是:main.User{Username:"admin",Password:123456}
context.Writef("接收到的数据是:%#+v\n", u1)
//也可以返回XML格式的数据
//context.XML(User{Username: "admin", Password: "123456"})
})
//8080 监听端口 ,如果未发现服务则返回系统自定义的错误
app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
}
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# 2.3 PUT & DELETE等请求
除了上述
GET
、POST
最为常见的两种请求方式以外,还有PUT
、DELETE
、OPTIONS
、HEAD
等其他类型请求,对于其他类型的请求,如同GET
和POST
请求一样进行处理。示例如下
package main
import (
"fmt"
"github.com/kataras/iris/v12"
)
//定义接收json、xml数据的结构体
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
func main() {
//创建一个app结构体指针对象
app := iris.New()
//type:PUT类型请求
app.Put("/putInfo", func(context iris.Context) {
path := context.Path()
app.Logger().Info("请求url:", path)
var u1 User
//获取前端传递过来的json数据,放入到结构体中
err := context.ReadJSON(&u1)
if err != nil {
fmt.Printf("获取用户信息错误,err:%v\n", err)
}
//输出接收到的数据是:main.User{Username:"admin",Password:123456}
context.Writef("接收到的数据是:%#+v\n", u1)
//也可以返回json格式的数据
//context.JSON(iris.Map{"message": "hello word", "requestCode": 200})
})
// DELETE请求
//type:DELETE类型请求
app.Delete("/deleteUser", func(context iris.Context) {
path := context.Path()
app.Logger().Info("Delete请求url:", path)
})
//8080 监听端口 ,如果未发现服务则返回系统自定义的错误
app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed))
}
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
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
# 3 请求处理的数据格式返回
我们已经学习了如何对不同类型的请求进行处理以及如何获取请求所携带的数据,当后台接收到请求后,将会对请求进行处理,处理完毕后将数据返回给请求的客户端。接下来,我们看一看如何将数据进行返回,以及都有哪些形式。 在进行请求处理时,处理方法
func
有一个参数context
。Context
是用于处理请求的上下文环境变量,用于处理http
请求及相关数据返回。iris
框架支持多种数据格式的返回,此处我们学习掌握返回string、json、xml
以及html
格式的数据。
# 3.1 返回string类型
context.WriteString("hello world")
1
# 3.2 返回json格式
context.JSON(iris.Map{"message": "hello word", "requestCode": 200})
1
# 3.3 返回xml格式
context.XML(User{Username: "admin", Password: 123456})
1
# 3.4 返回html格式
context.HTML("<h1> Hello World </h1>")
1
# 4 简单总结
数据操作 | 示例 | 描述 |
---|---|---|
获取json数据参数 | context.ReadJSON(&user) | 用context获取Json数据到结构体user里面 |
获取xml数据参数 | context.ReadXML(&user) | 用context获取xml数据到结构体user里面 |
获取form表单参数 | context.PostValue("username") | 用context获取form表单中对应key的数据 |
获取url地址参数 | context.URLParam("username") | 用context获取url地址中的参数数据 |
返回string类型 | contable text.WriteString("hello world") | 用context返回字符串给调用者 |
返回xml格式 | context.XML(User{Username: "admin", Password: 123456}) | 用context返回xml格式数据给调用者 |
返回html格式 | context.HTML("Hello World") | 用context返回html给调用者 |
返回json格式 | context.JSON(iris.Map{"message": "hello word", "requestCode": 200}) | 用context返回json数据给调用者 |