# 处理HTTP请求

http-handle

# 1 数据请求方式的分类

所有的项目中使用的请求都遵循HTTP协议标准,HTTP协议一共定义了八种方法用来对Request-URI网络资源的不同操作方式。HTTP协议经过了1.0和1.1两个版本的发展。

  • HTTP1.0定义了三种请求方法:GET, POSTHEAD方法。
  • HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACECONNECT 方法。

# 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。 如下是一个httpget类型的请求示例:

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.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 PUT & DELETE等请求

除了上述GETPOST最为常见的两种请求方式以外,还有PUTDELETEOPTIONSHEAD等其他类型请求,对于其他类型的请求,如同GETPOST请求一样进行处理。示例如下

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

# 3 请求处理的数据格式返回

我们已经学习了如何对不同类型的请求进行处理以及如何获取请求所携带的数据,当后台接收到请求后,将会对请求进行处理,处理完毕后将数据返回给请求的客户端。接下来,我们看一看如何将数据进行返回,以及都有哪些形式。 在进行请求处理时,处理方法func有一个参数contextContext是用于处理请求的上下文环境变量,用于处理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数据给调用者