beego与curl三件事

作者: 进击云原生 | 来源:发表于2018-08-25 10:21 被阅读11次

今天来看三件事:

1、beego的两个重要参数:

beego.BConfig.CopyRequestBody:

是否允许在HTTP请求时,返回原始请求体数据字节,默认为false(GET or HEAD or 上传文件请求除外)。

beego.BConfig.CopyRequestBody = false

在controller中this.Ctx.Input.RequestBody取body体时,需要注意必须把app.conf中的CopyRequestBody属性设置为true,并保证配置文件能被读取到。只有在非GET请求,this.Ctx.Input.RequestBody才能取到请求中的body体。

beego.BConfig.RecoverPanic:

是否异常恢复,默认值为 true,即当应用出现异常的情况,通过 recover 恢复回来,而不会导致应用异常退出。

beego.BConfig.RecoverPanic = true

在这里有一点需要说明,利用beego搭建的web工程最好用bee工具运行,因为在beego1.6.1版本,用go run运行,程序运行过程中出现了

slice bounds out of range:切片下标越界;

或者

invalid memory address or nil pointer dereference:没有初始化的地址,即空指针。

都不会打印日志,加大问题定位难度。

当使用beego1.8.3版本时,可以正常读到app.conf配置:

CopyRequestBody = true
HTTPPort = 8081
beego1.8.3启动

同样的app.conf配置,用beego1.6.1启动后:

beego1.6.1启动

但用bee工具启动时加载正常:

bee工具启动

经查阅资料,发现这是beego1.6.1版本的bug,issue见:

https://github.com/astaxie/beego/issues/1831

有兴趣可以看看各位大佬激烈的讨论。

2、beego参数接收:

第一种:路径参数 (Path Parameters):

就是用 URL 路径的一部分来作为我们获取参数值的一种方式。

如:

beego.Router("/:ak/:sk", &SayHelloController, "POST:SayHello")

或者

beego.Router("/?:ak/?:sk", &SayHelloController, "GET:SayHello")

接收方法如下:

方法一:

fmt.Println("---ak is --- ", this.GetString(":ak"))
fmt.Println("---sk is --- ", this.GetString(":sk"))



方法二:

sk1 := this.Ctx.Input.Param(":sk")
ak1 := this.Ctx.Input.Param(":ak")

第二种:查询参数 (Query string)

在 beego 中获取查询参数是十分方便的, 使用 beego.Controller.GetString() 便可以方便的获取查询参数(这个方法同样可以获取 request body 中的以 POST 方式发送的表单参数)。

在url中?之后,以&分隔的键值对。从某种意义上将这些键值对与表单是起到相同作用的,只是一个放在URL中,一个放在body中(当然表单get方式提交也是放到url中)它们都可以用不带 : 的方式获取。

方法一:
//获取?后面&分隔的参数
name2 := this.Input()["name"]
age2 := this.Input()["age"]

fmt.Printf("Name2:%s Age2:%s\n", name2, age2)


方法二:

//获取?后面的参数 key不能加:
name3 := this.GetString("name")
age3 :=  this.GetString("age")

fmt.Printf("Name3:%s Age3:%s\n", name3, age3)

第三种:Web 表单 (Web form):

可以利用 beego.Controller.GetString() 获取;如果是post的请求方式,也可以定义和表单对应的struct,然后将this.Ctx.Input.RequestBody转换为结构体对象:

type MyStruct struct {
    Name string `json:"name"`
    Age int `json:"age"`
}

myStruct := MyStruct{}

json.Unmarshal(this.Ctx.Input.RequestBody, &myStruct)

3、执行curl命令:

执行curl命令调接口时,参数传递需要注意:

如:

curl -X GET http://10.119.155.114:8081/jgjgjg/sqasdasda?name=jingge&age=21 -v

如果直接发送,& 会被系统解析(空格等字符也会被系统解析)

需对特殊字符进行转义。上面的命令可以修改为:

curl -X GET http://10.119.155.114:8081/jgjgjg/sqasdasda?name=jingge&age=21 -v

在 & 前加转义符 \ ( 空格可用+或者%20取代 )

或者给 url 加双引号,如:

curl -X GET "http://10.119.155.114:8081/jgjgjg/sqasdasda?name=jingge&age=21" -v

注意:

我测试过,在windows上用%26代替&,都会导致name取到jingge&age=21整体,而age取不到值,用 \ 转义会导致name取到jingge\,而age取不到值,如下图:

%26代替&,\转义&

%26代替&:

%26代替&结果

\ 转义&:

\ 转义&结果

唯一可行的是在url上加双引号;

在linux上用%26也会导致name取到jingge&age=21整体,而age取不到值,但是用 \ 转义和加双引号都可以。


最后,csdn资源,收集了海量学习资料,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以关注以下公众号后回复【2】,获取。


我是小碗汤,我们一起学习,扫码关注,精彩内容第一时间推给你

欢迎扫码关注

相关文章

  • beego与curl三件事

    今天来看三件事: 1、beego的两个重要参数: beego.BConfig.CopyRequestBody: 是...

  • beego生成api工程

    生成beego工程之前需要先配置好beego与bee环境 生成beego工程 本工程采用api的形式,不需要界面,...

  • beego源码分析笔记一

    beego官网:https://beego.me/ beego 的架构 beego 的整体设计架构如下所示: 官方...

  • beego 模版语法

    beego 模板语法指南 本文讲述 beego 中使用的模板语法,与 go 模板语法基本相同。 基本语法 go 统...

  • beego 路由详解

    beego路由设置 beego存在三种方式的路由:固定路由、正则路由、自动路由。下面就详细说一下如何使用这三种路由...

  • ota go 服务搭建

    整体设计: golang&beego 在设计中,采用了golang 语言,使用了开源的beego , beego ...

  • Beego Architecture

    https://beego.me/[https://beego.me/] Beego框架起始于2012年由中国程序...

  • HTTP小记

    curl命令 curl命令一般有三种 curl -s -v -H "colin: xxx" -- "https:/...

  • Beego自动化文档(最新版)

    之前写过一篇使用Beego自动化api文档的文章:Beego自动化文档,随着Beego的更新,1.7.0之后Bee...

  • Awesome Go

    Go 包 beego。算起来用了三年beego了。当初选择用它的理由很简单,文档是中文的,开发者是中国的,交流方便...

网友评论

    本文标题:beego与curl三件事

    本文链接:https://www.haomeiwen.com/subject/uabwiftx.html