go语言web开发04 - http请求往后端发送数据与后端往前端返回数据
一、get请求往后端发送数据与后端获取客户端发送数据的两种方法
1.1、http get请求往后端发送数据与后端获取get请求发送的数据方法一:参数键值对类型数据
1.路由设置:beego.Router("/user", &controller.UserController{}) 2.客户端请求路径:http://127.0.0.1:8090/user?id=111 3.后端获取客户端发送数据的两种方法: 3.1.方法一:id := c.Input().Get("id") 3.2.方法二:id2 := c.GetString("id")
1.2、http get请求往后端发送数据与后端获取get请求发送的数据方法二:路径类型数据
1.路由设置:beego.Router("/user/?:id:int", &controller.UserController{}) 2.客户端请求路径:http://127.0.0.1:8090/user/111 3.后端获取客户端发送数据的两种方法: 3.1、方法一:id := c.GetString(":id") 3.2、方法二:id2 := c.Ctx.Input.Param(":id")
二、post请求往后端发送数据与后端获取客户端发送的数据的方法
2.1、路由设置
beego.Router("/params", &controllers.ParamsController{})
2.2、form表单提交post请求
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>POST提交数据</h1> <form action="/params" method="POST"> <!-- action="/params": 是请求的路径。method:是请求的方法 --> 用户名:<input type="text" name="username"><br> <!-- form表单提交数据时一定要有name这个标签,同时指定值,后端是根据name的值来获取请求的数据的 --> 年 龄: <input type="text" name="age"><br> 价 格: <input type="text" name="price"><br> <!-- 是:<input type="radio" name="is_true" value="true"> --> <!-- 否:<input type="radio" name="is_true" value="false"><br> --> <!-- 单选radio时要保证多个radio类型的name字段的值要一样(如果name字段不一样就是多选了) --> <input type="submit" value="提交"> <!-- 提交按钮的类型一定要是submit才可以提交数据到后端 --> </form> </body> </html>
2.3、后端获取post请求里的数据
方法一:通过GetString()方法获取请求里的数据
func (c *ParamsController) Post() {
username := c.GetString("username")
age := c.GetString("age")
price := c.GetString("price")
fmt.Println(username)
fmt.Println(age)
fmt.Println(price)
}
方法二:通过ParseForm()将请求数据解析到结构体
type UserStruct struct { Name string `form:"username"` Age int `form:"age"` Price int `form:"price"` } func (c *ParamsController) Post() { user := UserStruct{} err := c.ParseForm(&user) if err != nil { fmt.Println("parseForm failed:",err) } fmt.Println(user) c.TplName = "success.html" }
三、ajax往后端发送数据与后端获取ajax发送数据的两种方法
3.1、全局配置
1、路由设置
beego.Router("/ajax_test", &controllers.AjaxController{})
2、添加配置
使用ajax进行数据交互需要在配置文件 “app.conf” 里添加如下配置,使beego支持获取Request Body 里的 JSON 或 XML 的数据。
copyrequestbody = true
3.2、ajax发送json格式的数据给后端与后端获取数据并响应ajax
1、ajax发送数据到后端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="/static/js/jquery.min.js"></script> <!-- 引用jquery文件 --> </head> <body> <h1>ajax 提交数据</h1> <form> <!-- 这里也是用form表单获取数据,但是没有指定提交数据的路径和方法 --> 用户名:<input type="text" name="username" id="username"><br> <!-- 此处的input标签需要有id或者class字段与对应的值,ajax获取数据时会用到 --> 年 龄: <input type="text" name="age" id="age"><br> 价 格: <input type="text" name="price" id="price"><br> <input type="button" value="提交" id="btn"> <!-- 这里提交按钮的类型就不是submit而是button了,submit类型是提交数据,button类型就是一个普通的按钮(不会自动提交数据) --> </form> <!-- js --> <script> var btn = document.getElementById("btn"); // 根据id获取提交按钮 btn.onclick = function() { // 给提交按钮绑定点击事件(onclick是点击事件)的脚本 var username = document.getElementById("username").value; // 根据id是username值的标签获取输入框内的值 var age = document.getElementById("age").value; var price = document.getElementById("price").value; $.ajax({ // 发送alax请求 url: "/ajax_test", // 请求的路径 type: "POST", // 请求的方法 data: JSON.stringify({ // 通过json方法将发送的数据编码 "username": username, "age": age, "price": price }), dataType: "JSON", // 指定交互的数据类型为JSON类型 success:function(data) { // 发送数据成功触发的函数,(data)为后端返回的数据 var code = data["code"] // 获取返回数据里的code字段和message字段 var message = data["mssage"] if (code == "200"){ // 判断,如果code == 200就是处理成功 alert(message) // 弹出返回的消息 } }, error:function(data) { // 发送数据失败触发的函数,(data)为后端返回的数据 alert("处理异常") } }) } </script> </body> </html>
2、后端获取ajax发送的json数据
// 定义结构体 type UserStruct struct { UserName string Age string Price string } func (c *AjaxController) Post() { var user UserStruct // ajax发送的所有数据都是字符串类型的,这里结构体的字段要都设置字符串类型 // 获取ajax数据 - 需要再配置文件里添加:copyrequestbody = true(如果不设置这个配置无法通过ajax实现交互) body := c.Ctx.Input.RequestBody json.Unmarshal(body, &user1) // 将body里的数据直接解析到结构体 fmt.Println(user) var result = map[string]string{"code": "200", "mssage": "处理成功"} c.Data["json"] = result // 返回数据,返回的数据键一定要是”json“ c.ServeJSON() // 返回json格式数据 }
3.3、ajax发送字符串类型的数据到后端与后端获取数据并返回处理结果
1、ajax发送数据到后端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="/static/js/jquery.min.js"></script> <!-- 引用jquery文件 --> </head> <body> <h1>ajax 提交数据</h1> <form> <!-- 这里也是用form表单获取数据,但是没有指定提交数据的路径和方法 --> 用户名:<input type="text" name="username" id="username"><br> <!-- 此处的input标签需要有id或者class字段与对应的值,ajax获取数据时会用到 --> 年 龄: <input type="text" name="age" id="age"><br> 价 格: <input type="text" name="price" id="price"><br> <input type="button" value="提交" id="btn"> <!-- 这里提交按钮的类型就不是submit而是button了,submit类型是提交数据,button类型就是一个普通的按钮(不会自动提交数据) --> </form> <!-- js --> <script> var btn = document.getElementById("btn"); // 根据id获取提交按钮 btn.onclick = function() { // 给提交按钮绑定点击事件(onclick是点击事件)的脚本 var username = document.getElementById("username").value; // 根据id是username值的标签获取输入框内的值 var age = document.getElementById("age").value; var price = document.getElementById("price").value; $.ajax({ // 发送alax请求 url: "/ajax_test", // 请求的路径 type: "POST", // 请求的方法 data: { // ajax发送的数据(这里没有通过json编码) "username": username, "age": age, "price": price }, dataType: "JSON", // 指定交互的数据类型为JSON类型 success:function(data) { // 发送数据成功触发的函数,(data)为后端返回的数据 var code = data["code"] // 获取返回数据里的code字段和message字段 var message = data["mssage"] if (code == "200"){ // 判断,如果code == 200就是处理成功 alert(message) // 弹出返回的消息 } }, error:function(data) { // 发送数据失败触发的函数,(data)为后端返回的数据 alert("处理异常") } }) } </script> </body> </html>
2、后端获取ajax发送的数据并响应ajax
func (c *Ajax2Controller) Post() { username := c.GetString("username") // 直接通过GetString()方法即可获取ajax发送的数据 age := c.GetString("age") price := c.GetString("price") fmt.Println(username, age, price) var result = map[string]string{"code": "200", "message": "处理成功",} c.Data["json"] = result c.ServeJSON() }
四、后端返回数据
4.1、路由配置
beego.Router("/othertype", &controllers.OtherTypeController{})
4.2、返回json格式数据
// 定义返回数据类型 type UserStruct struct { Id int `form:"id"` Name string `form:"username"` Age int `form:"age"` Price int `form:"price"` } // 返回json格式数据 func (c *OtherTypeController) Get() { user := UserStruct{Id: 1, Name: "Dream", Age: 22, Price: 45,} json格式数据传输 c.Data["json"] = &user // c.Data["json"] :里面的键一定要是“json”, 返回什么数据就要是什么 c.ServeJSON() // 返回数据 }
访问:
4.3、返回xml格式数据
// 定义返回数据类型 type UserStruct struct { Id int `form:"id"` Name string `form:"username"` Age int `form:"age"` Price int `form:"price"` } // 返回json格式数据 func (c *OtherTypeController) Get() { user := UserStruct{Id: 1, Name: "Dream", Age: 22, Price: 45,} json格式数据传输 c.Data["xml"] = &user // c.Data["xml"] :里面的键一定要是“xml”, 返回什么数据就要是什么 c.ServeXML() // 返回数据 }
访问:
4.4、返回jsonp格式数据
// 定义返回数据类型 type UserStruct struct { Id int `form:"id"` Name string `form:"username"` Age int `form:"age"` Price int `form:"price"` } // 返回json格式数据 func (c *OtherTypeController) Get() { user := UserStruct{Id: 1, Name: "Dream", Age: 22, Price: 45,} json格式数据传输 c.Data["jsonp"] = &user // c.Data["jsonp"] :里面的键一定要是“jsonp”, 返回什么数据就要是什么 c.ServeJSONP() // 返回数据 }
访问:
4.5、返回yaml格式数据
// 定义返回数据类型 type UserStruct struct { Id int `form:"id"` Name string `form:"username"` Age int `form:"age"` Price int `form:"price"` } // 返回json格式数据 func (c *OtherTypeController) Get() { user := UserStruct{Id: 1, Name: "Dream", Age: 22, Price: 45,} json格式数据传输 c.Data["yaml"] = &user // c.Data["yaml"] :里面的键一定要是“yaml”, 返回什么数据就要是什么 c.ServeYAML() // 返回数据 }
返回YAML格式数据访问时直接是一个YAML格式的文件下载下来了。