问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Go+Beego实现简单API接口

发布网友 发布时间:19小时前

我来回答

1个回答

热心网友 时间:19小时前

项目地址:https://github.com/CJFJack/go_api_demo

背景

在日常运维工作中,当遇到同时维护多台服务器的场景,经常需要用到ansible、saltstack、puppet等工具。但某些场景下,服务器之间处于不同的内网,又不想开放ssh端口到公网,或者遇到跨平台的情况下,saltstack又觉得太重,可以尝试自己实现agent,达到操作服务器的目的。

借用saltstack的一张执行原理图:

Beego介绍

Beego是一个能够快速开发Go应用程序的WEB框架。它可以用来迅速地开发API、网络App和后端服务。同时,它也可以作为RESTful框架。其设计灵感主要来自Python和Rails流行的框架,借鉴了Python语言开发的框架Tornado和Flask以及Ruby开发的web框架Sinatra。

Beego与其他框架的最大区别,是我们不仅在追求框架性能的同时,更加关注于开发效率,解放程序员的生产力。通常情况下,我们做一个业务的时候,在使用一些WEB框架需要纠结的选择各种组件和编写自己的中间件,将这些代码拼接到一起,这个繁琐过程可以理解成我们拿了一堆锤子、钉子在组装一个工具,做好了工具才能开始需求,导致我们开发人员陷入到选轮子、造轮子的加班困境中。

借助bee工具可以轻松创建基于beego的api项目

//安装gogetgithub.com/beego/bee//创建api项目beeapi<yourprojectname>//创建web项目beenew<yourprojectname>?简单的接口认证

客户端请求api接口时,在请求的header中加入指定的token

定义APIController,在Prepare函数中校验请求token,实现权限校验

packageauthimport("fmt""github.com/astaxie/beego""go_api_demo/base""go_api_demo/base/response")typeAPIControllerstruct{base.BaseController}func(c*APIController)Prepare(){c.EnableXSRF=falsetoken:=fmt.Sprintf("Token%s",beego.AppConfig.DefaultString("api::token",""))headerToken:=c.Ctx.Input.Header("Authorization")iftoken!=headerToken{c.Data["json"]=response.UnAuthorizationc.ServeJSON()}}

接下来就可以在其他处理请求的crontroller中继承APIController

packagev1import("github.com/astaxie/beego/logs""go_api_demo/base/auth""go_api_demo/base/response""go_api_demo/forms")typeTeststruct{auth.APIController}func(c*Test)Post(){ifc.Ctx.Request.Method=="POST"{c.Data["json"]=response.Okform:=forms.TestPostForm{}ifrawData,err:=c.ParsePostForm(form);err==nil{logs.Info(rawData)//dosomething...}else{logs.Error(err)c.Data["json"]=response.BadRequest}}else{c.Data["json"]=response.BadMethod}}func(c*Test)Get(){ifc.Ctx.Request.Method=="GET"{c.Data["json"]=response.Ok//uuid:=c.GetString("uuid")//logs.Info(uuid)}else{c.Data["json"]=response.BadMethod}}

添加路由

路由一般包含版本信息,便于以后扩展和迭代

packageroutersimport("github.com/astaxie/beego"v1"go_api_demo/controllers/api/v1")funcinit(){//v1v1Test:=beego.NewNamespace("v1",beego.NSAutoRouter(&v1.Test{}))beego.AddNamespace(v1Test)}

最后分享两个go执行shell脚本的方法

实时打印输出

import("fmt""github.com/astaxie/beego/logs""io""os/exec""strings")funcasyncLog(readerio.ReadCloser)error{cache:=""buf:=make([]byte,1024,1024)for{num,err:=reader.Read(buf)iferr!=nil{iferr==io.EOF||strings.Contains(err.Error(),"closed"){returnnil}returnerr}ifnum>0{oByte:=buf[:num]oSlice:=strings.Split(string(oByte),"\n")line:=strings.Join(oSlice[:len(oSlice)-1],"\n")logs.Info(fmt.Sprintf("%s%s\n",cache,line))cache=oSlice[len(oSlice)-1]}}}funcRunShellPrintRealtime(scriptPathstring)error{logs.Info("runshellstart")cmd:=exec.Command("sh","-c",scriptPath)stdout,_:=cmd.StdoutPipe()stderr,_:=cmd.StderrPipe()iferr:=cmd.Start();err!=nil{logs.Info(fmt.Sprintf("Errorstartingcommand:%s......",err.Error()))returnerr}goasyncLog(stdout)goasyncLog(stderr)iferr:=cmd.Wait();err!=nil{logs.Info(fmt.Sprintf("Errorwaitingforcommandexecution:%s......",err.Error()))returnerr}logs.Info("runshellfinish")returnnil}

执行完成后打印输出

funcRunShell(scriptPathstring)error{logs.Info("startrunshell")cmd:=exec.Command("/bin/bash","-c",scriptPath)err:=cmd.Run()iferr!=nil{logs.Error(fmt.Sprintf("ExecuteCommand%sfailed:%s",scriptPath,err.Error()))returnerr}logs.Info(fmt.Sprintf("ExecuteCommand%sfinished.",scriptPath))logs.Info("runshellfinish")returnnil}

参考文档

Golang:https://golang.google.cn/

Beego:https://beego.me/

项目地址:https://github.com/CJFJack/go_api_demo

公众号:AIOps自动化运维

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天秤男吃醋的八大表现 天秤座男生吃醋时的表现 人工授精之后注意什么 人授后需要卧床休息吗 ...经两个月没发工资了,我不想干了,老板不给钱怎么办? 新手玩《兰斯10》这款游戏的快速通关攻略是什么? 兰斯10怎么用食券快速刷SSR 兰斯10二周目7cp怎么达成 兰斯10大侵攻达成条件介绍 跳舞同手同脚叫什么来着 喷油嘴清洗机主要功能 拼多多拼小圈在哪里查看?拼小圈是什么意思? 我姓颜,叫颜琴,取一个微信名带颜字或者琴字,取什么名字好听呢... 俄罗斯的人长什么样子 ...火星星座,木星星座,水星星座呢?我的出生日期1988年7月13日凌晨15... ...without you l will be so far away from home ”??? 求《far away from home,groove coverage 》中文歌词 求&lt;far away from home&gt;的歌词及翻译!急吖… 徐字组词俩个字? 裙带菜哪里买 裙带菜什么牌子好 裙带菜有哪些牌子 九种abs风口价格及其产品信息 abs风口如何选择 空调风口abs尺寸是多少 淘宝哪家欧莱雅是正品,淘宝欧莱雅正品店推荐 卡游为什么火了 元卡片有什么玩法 Kayou卡游欧布奥特曼卡片-收集回忆,健康游戏,让孩子享受收藏的乐趣 混凝土试块强度达到多少合格 混凝土强度达到多少合格 请教:混凝土设计强度等级为C20,取芯抗压强度只有20.3MPa,算不算合格... 头盖龙兽动画中的头盖龙兽 钻石版头盖龙的问题 《口袋妖怪 白金》 挖化石的问题... u盘电脑可以识别手机不识别u盘电脑能读手机不能读咋回事 主板dram亮黄灯 u盘能插电脑但是不能插手机我电脑USB为什么可以识别U盘但插上手机就识... k线上的柱子是什么 阴阳线长短精细是什么意思 奇怪的梦,寓意着什么? 奇怪的梦。。。什么意思 悟净南红家还不错吧这家? 我的建行被拉黑后我还清了有什么后果吗 建行工资卡就因为三个月短信通知费没有交,拉我进黑名单了,请问怎么取 ... iPhone怎么拉黑了95588,还是会收到短信 鹿城区本地企业高性价比选择 新华保险对比太平洋保险,哪个更实力强一点? 阳光人寿臻盈倍致终身寿险(分红型)买了亏不亏?保障责任全吗? 手机屏如何选购 手机屏幕哪种材质好 如何辨别手机屏幕是不是原装 在哪选手机屏幕比较好?