问题.beego路由设置及请求参数传递
2017-12-23 23:33
411 查看
最近项目组安排将一组Lua实现的web服务端代码重构成Go实现,所以顺便学习了下Lua和Go,这里记录下在尝试重构的过程中遇到的几个问题。
1.beego路由设置
路由设置简单说下,主要是调用了package routers的init()方法
// @APIVersion 1.0.0 // @Title beego Test API // @Description beego has a very cool tools to autogenerate documents for your API // @Contact astaxie@gmail.com // @TermsOfServiceUrl http://beego.me/ // @License Apache 2.0 // @LicenseUrl http://www.apache.org/licenses/LICENSE-2.0.html package routers import ( "github.com/astaxie/beego" "market/src/controllers" ) func init() { ns := beego.NewNamespace("/market", beego.NSNamespace("/exchange", beego.NSInclude( &controllers.MarketController{}, &controllers.OnlineGameController{}, &controllers.GoodsResController{}, &controllers.UserInfoController{}, &controllers.MissionRewardController{}, ), ), ) beego.AddNamespace(ns) }
再去package controllers下创建对应的路由
package controllers import ( "common/log" "encoding/json" "github.com/astaxie/beego" "market/src/models" ) type OnlineGameController struct { beego.Controller } // GetMarketInfo : // @Title GetOnlineGameInfo // @Description : get online game info // @Success 0 {object} models.OnlineGameInfoResp // @router /queryOnlineGameInfo [post,get]func (this *OnlineGameController) GetOnlineGameInfo() { this.Ctx.ResponseWriter.Header().Add("Access-Control-Allow-Origin", "*") this.Ctx.ResponseWriter.Header().Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept") var req models.OnlineGameInfoRequest reqData := this.GetString("data") json.Unmarshal(([]byte)(reqData), &req) res := models.OnlineGameInfoResp{} defer func() { resJson, _ := json.Marshal(res) this.Data["json"] = res this.ServeJSON() log.LOGACCESS("GetOnlineGameInfo:\nrequest param:%v, \ntransfer struct:%v, \nresponse:%v", reqData, req, string(resJson)) }() errCode, errMsg := req.ValidParam() if errMsg != nil { res.ErrCode = errCode res.ErrMsg = errMsg.Error() return } models.QueryOnlineGameInfoList(&req, &res) }
其中:
this.Ctx.ResponseWriter.Header().Add("Access-Control-Allow-Origin", "*") this.Ctx.ResponseWriter.Header().Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
是为了解决beego响应的跨域问题,否则如ajax等请求接收不到返回值。
另外:注解@router可以生成路由router包的初始化方法
// @router /queryOnlineGameInfo [post,get]
如果没有,在编译执行时,会发现router的init方法中没有这个路由,尽管你可以手动加上去重新启动服务,但是下次重新编译执行时仍然会被刷掉
生成的init方法如下:
package routers import ( "github.com/astaxie/beego" "github.com/astaxie/beego/context/param" ) func init() { beego.GlobalControllerRouter["migu_market/src/controllers:OnlineGameController"] = append(beego.GlobalControllerRouter["migu_market/src/controllers:OnlineGameController"], beego.ControllerComments{ Method: "GetOnlineGameInfo", Router: `/queryOnlineGameInfo`, AllowHTTPMethods: []string{"post", "get"}, MethodParams: param.Make(), Params: nil}) ..... }
2.http请求的参数传递
var req models.OnlineGameInfoRequest reqData := this.GetString("data") json.Unmarshal(([]byte)(reqData), &req)
在上面controllers中,使用beego路由的 GetString("data")方法获取一个json字符串(注意这里是json字符串不是数组),所以在请求时参数也应为字符串,(以ajax为例)
var pid = "13"; var innerID = "13"; var gameID = "1"; var channel = "c1"; var version = "1"; var versionName = "v1"; var pkgArr = ["a","b","c"] var json = {}; json.channel = channel; json.pid = pid; json.versionName = versionName; json.version = version; json.gameID = gameID; json.innerID = innerID; json.pkgNames = pkgArr; $.post("http://127.0.0.1:18080/market/exchange/queryOnlineGameInfo",{ "data": JSON.stringify(json) },function(data){ $("#response").html(JSON.stringify(data)) },'json');
这里对于JSON.stringify()有一个疑惑,对于json的两种写法出现不同的结果,如果有朋友看到此处,希望可以帮忙解答。如下两种写法,第二种写法会报错。
var name = "shm"; var age = "18"; var sex = "man"; var student = {}; student.name = name; student.age = age; student.sex = sex; var pid = "13"; var innerID = "13"; var gameID = "1"; var channel = "c1"; var version = "1"; var versionName = "v1"; var json = {}; json.channel = channel; json.pid = pid; json.versionName = versionName; json.version = version; json.gameID = gameID; json.innerID = innerID; json.student = student; alert(JSON.stringify(data));
var json = { channel : channel, pid : pid, versionName : versionName, version : version, gameID : gameID, innerID : innerID, student : { name : name, age : age, sex : sex } alert(JSON.stringify(data));
在获取到json字符串后,使用json.Unmarshal解析,并把结果赋给一个指定的结构体实例,注意这里传的是指针。(很好理解,因为我们就是希望json方法在处理时把值赋给当前这个实例,如果传入的是实例,那么json方法接收的将是这个实例的一个副本,就是说方法的处理不会修改当前实例,这点跟java里有些区别,java传参时除了基本类型外,传的参数都是实例的引用也就是指针,而go做了区分,除指针外,传参均为值传递),对应的结构体定义如下:
package models import ( "bytes" "common/log" "errors" "github.com/astaxie/beego/orm" "strconv" "strings" utf8 "unicode/utf8" ) type OnlineGameInfoRequest struct { Channel string `json:"channel"` Pid string `json:"pid"` VersionName string `json:"versionName"` Version string `json:"version"` GameID string `json:"gameID"` //Lua与文档不一致的字段 InnerID string `json:"innerID"` FileCid string `json:"fileCid"` PkgNames []string `json:"pkgNames"` IntGameID int IntVersion int IntInnerID int IntPid int } ... }
相关文章推荐
- 用thickbox时,在后台请求不到传递的参数.的问题
- 微信公众号平台网页授权接口中获取到的授权code传递给(即一个微信公众号网页授权给)任何其他多个回调域名下的url,解决了只能设置一个网页授权回调域名的问题,解决了redirect_uri参数错误的问
- Asp.NET应用thickbox.js传递参数,后台请求不到的问题
- get/post请求,以及参数传递过程中乱码问题
- angular2路由path不能传递参数的问题
- SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
- js给iframe动态设置src和参数参数传递问题
- SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
- 导入Thymeleaf、正确设置URL的输入、相应请求、参数传递
- 解决axios,post请求传递不了对象{}参数的问题
- 解决post请求接收数据类型为text/html时参数传递的问题
- 使用SpringMVC参数传递时,解决get请求时中文乱码的问题
- 解决spring设置filter过滤器结合rest风格获取post请求body参数输入流问题
- 解决spring设置filter过滤器结合rest风格获取post请求body参数输入流问题
- 1:HTML 中 onclick 触发函数 xxx(param) 要传递对象参数的解决方法 2:LocalStorage存储JSON对象的问题 3:ajax请求传送参数为对象问题
- Java中函数参数的值传递与引用传递问题
- 参数传递问题
- pager-taglib中传递参数时中文乱码问题
- delphi调用C# WEB服务,参数传递问题 (转)
- c# winform窗体之间传递参数问题总结