问题.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
} ...
}
问题.beego路由设置及请求参数传递的更多相关文章
- golang学习笔记6 beego项目路由设置
golang学习笔记5 beego项目路由设置 前面我们已经创建了 beego 项目,而且我们也看到它已经运行起来了,那么是如何运行起来的呢?让我们从入口文件先分析起来吧: package main ...
- beego框架学习(二) -路由设置
路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...
- 【beego】beego的路由设置
beego 存在三种方式的路由:固定路由.正则路由.自动路由 基础路由 从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由,应用中的大多数路由都会定义在 routers/rout ...
- IIS 7.5 + asp.net MVC4 设置路由处理URL请求
使用asp.net MVC4开发的网站,在本地的VS012环境下运行,一切正常.但当发布到Windows 2008 R2(IIS7.5 + Framework4.5)上时,访问相关网页时,出现有下面的 ...
- .Net Core 学习路由和请求参数传递
一.配置默认路由方式 {Controller=Home}/{action=Index}/{id?} 默认请求地址:http://localhost:xxx/home/index /id? 是可选项例如 ...
- begoo——路由设置
路由本质是URL与要为该URL调用的视图函数之间的映射表,其实就是你定义的使用那个URL调用那段代码的关系对应表. 首先看一下最简单的路由: package routers import ( &quo ...
- Go语言web开发---Beego路由
参考链接(查看更多):https://beego.me/docs/mvc/controller/router.md 基础路由 从 beego 1.2 版本开始支持了基本的 RESTful 函数式路由, ...
- MVC3.0,路由设置实现伪静态IIS中404错误
C# code? 1 2 3 4 5 routes.MapRoute("NewQueryTest.asp", "NewQueryTest ...
- express中路由设置的坑-----1
router.get('/commodities/sortable', utils.logged, function (req, res) { Commodity.find({force_top:tr ...
随机推荐
- 2019牛客暑期多校训练营(第四场)K.number
>传送门< 题意:给你一个字符串s,求出其中能整除300的子串个数(子串要求是连续的,允许前面有0) 思路: >动态规划 记f[i][j]为右端点满足mod 300 = j的子串个数 ...
- 100天搞定机器学习|Day8 逻辑回归的数学原理
机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机器学习|D ...
- spring-boot-plus集成Spring Boot Admin管理和监控应用
Spring Boot Admin Spring Boot Admin用来管理和监控Spring Boot应用程序 应用程序向我们的Spring Boot Admin Client注册(通过HTTP) ...
- 林大妈的JavaScript基础知识(三):JavaScript编程(3)原型
在一般的编程语言中,我们使用继承来复用代码,做成良好的数据结构.而在JavaScript中,我们使用原型来实现以上的需求.由于JavaScript专注于对象而摒弃了类,我们要明白原型和继承的确是有差异 ...
- JDK的命令行工具系列 (二) javap、jinfo、jmap
javap: 反编译工具, 可用来查看java编译器生成的字节码 参数摘要: -help 帮助 -l 输出行和变量的表 -public 只输出public方法和域 -protected 只输出publ ...
- 简单聊聊红黑树(Red Black Tree)
前言 众所周知,红黑树是非常经典,也很非常重要的数据结构,自从1972年被发明以来,因为其稳定高效的特性,40多年的时间里,红黑树一直应用在许多系统组件和基础类库中,默默无闻的为我们提供服务,身边 ...
- Resource 使用详解
极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...
- ASP.NET Web项目发布选项:“允许更新此预编译站点” 详解
目录 #使用visual studio 发布web项目 #"允许更新此预编译站点" 选项的意义 1.选中 "允许更新此预编译站点" 2.不选中 "允许 ...
- 【Java例题】3.1 7、11、13的倍数
1.找出1~5000范围内分别满足如下条件的数: (1) 7或11或13的倍数 (2) 7.11,或7.13或11.13的倍数 (3) 7.11和13的倍数. package chapter3; pu ...
- java并发编程(十二)----(JUC原子类)数组类型介绍
上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray.其中前两个的使用方 ...