最近项目组安排将一组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 routersimport ("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 controllersimport ("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.OnlineGameInfoRequestreqData := this.GetString("data")json.Unmarshal(([]byte)(reqData), &req)res := models.OnlineGameInfoResp{}defer func() {resJson, _ := json.Marshal(res)this.Data["json"] = resthis.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 = errCoderes.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 routersimport ("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 modelsimport ("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  intIntVersion intIntInnerID intIntPid     int
}...
}

转载于:https://www.cnblogs.com/shanhm1991/p/7145016.html

问题.beego路由设置及请求参数传递相关推荐

  1. php ci url,URL路由设置-CI(codeigniter)PHP框架再探

    前面文章整体说了一下Codeigniter的访问,其中涉及到route,URL路由设置,下面对CI再说一下 在application/config/文件夹下有routes.php的设置. 1.首先说U ...

  2. AJAX学习笔记(基本使用,请求参数传递,获取服务端响应,错误处理,低版本IE浏览器缓存问题及解决)

    1. Ajax实现步骤 创建ajax对象 let xhr = new XMLHttpRequest(); 告诉ajax请求地址及请求方式 xhr.open('get','http://www.exam ...

  3. mysql的请求分发,基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用

    基于 gorilla/mux 实现路由匹配和请求分发:服务单页面应用 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 1279 views 0 likes 0 collects 随着前后 ...

  4. 如何修改win服务器默认路由,服务器win默认路由设置方法

    服务器win默认路由设置方法 内容精选 换一换 如果您是通过控制台操作时遇到该问题,请检查头显上的客户端是否为1.4.0及以上版本,详见控制台方式.如果您是通过调用API时遇到该问题,请检查调用&qu ...

  5. 从0到1实现一个Android路由(6)——拦截请求再跳转

    从0到1实现一个Android路由系列文章 从0到1实现一个Android路由(1)--初探路由 从0到1实现一个Android路由(2)--URL解析器 从0到1实现一个Android路由(3)-- ...

  6. 华为模拟器静态路由默认路由设置及VLAN配置

    华为模拟器静态路由/默认路由设置及VLAN配置 文章目录 华为模拟器静态路由/默认路由设置及VLAN配置 一.路由器的工作原理 1.1.路由器接口配置ip命令 1.2.设置静态路由/默认路由 二.VL ...

  7. 转:Ubuntu 开机加载路由设置

    Ubuntu 开机加载路由设置 2011-02-25 17:31 Ubuntu 开机加载路由设置(2009-08-17 09:35:29) 转载 标签:杂谈 分类:手记 1.首先,我们创建一个 /et ...

  8. thinkphp路由配置 php7.0,thinkphp3.2 路由设置方法

    在配置文件中增加路由设置Application\Common\Conf\config.php 下面是ThinkPHP3.2路由设置中规则表达式的配置方式 return array( 'URL_ROUT ...

  9. 华为q1设置虚拟服务器,如何使用华为华为Q1 Q1互联网路由设置图文教程 | 192.168.1.1手机登陆...

    华为路由Q1如何设置?作为一个主流的智能路由器,华为Q1采用创新的概念聚类路由的路由,路由器通过塞集群互连,增强覆盖效果,更适合小户型使用,以下是带一个小系列华为Q1路由设置在线教程,包括路由器连接W ...

最新文章

  1. 【Spring boot 实战】使用Maven插件构建Docker镜像
  2. cumprod--累积连乘
  3. 服务器端的根目录放置文件,放置在网站根目录下
  4. CSS清除默认样式,经典好文
  5. 技术如何转型产品经理
  6. MySQL MVCC 概述
  7. Leetcode-MySQL-197. 上升的温度
  8. 系统集成资质培训 - 2013下半年系统集成资质申报及集成资质考试
  9. 使用Python编写程序安排期末考试监考
  10. 二维特征分类的基础_3D 分割分类总结
  11. [NOIP2013]华容道 题解(搜索)
  12. 实测Linux ext3/4文件系统的规模与瓶颈
  13. 制作粉色少女系列❤生日快乐祝福网页❤(HTML+CSS+JS)
  14. favos-demo代码解读
  15. 微信10亿日活场景下,后台系统微服务架构实践
  16. leetcode-腾讯精选50题-02
  17. java9.0.4配置_Tomcat 9.0 安装配置
  18. 视频教程-Python开发全教程-Python
  19. 双重检查锁与单例模式
  20. 大数据开发的面试总结

热门文章

  1. 编程语言python特点-常用编程语言介绍及各特点
  2. 笔记本电脑下载python视频教程-如何使用Python访问/下载OneNote笔记本?
  3. python3.6.5下载-python3.6.5下载
  4. python自学教程 pdf-《Python编程从入门到精通》PDF高清完整版-PDF下载
  5. python代码块-Python 代码块
  6. python编程用什么电脑好-初学Python编程看哪些书比较好?
  7. php和python交互-PHP与Python进行数据交互
  8. 哪个版本python适用于windows-何种版本的Python适合您
  9. python介绍和用途-Python基础介绍(一)
  10. python读取中文-python读取中文txt文本