zoukankan      html  css  js  c++  java
  • 问题.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:
    request param:%v, 
    transfer struct:%v, 
    response:%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
    }
    
    ...
    }
    
  • 相关阅读:
    5.Hiveguigun滚(ノ`Д)ノ竟然竞争谨慎谨慎谨慎哈喇子罢工八公
    4.HadoopMapRe程序设计
    3.MapReduce原理和Yarn
    java注解
    各种操作系统远程windows服务器
    protocol-buffers
    反向生成实体类
    java 反射
    web api 返回数据
    Newtonsoft.Json
  • 原文地址:https://www.cnblogs.com/shanhm1991/p/7145016.html
Copyright © 2011-2022 走看看