问题.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 [email protected]
// @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
}

...
}

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

你可能感兴趣的:(问题.beego路由设置及请求参数传递)