问题.beego路由设置及请求参数传递

最近项目组安排将一组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
}

...
}
(0)

相关推荐