跳过正文
beego与curl三件事
  1. Posts/

beego与curl三件事

·1401 字·3 分钟· · ·
Beego Golang Curl
小碗汤
作者
小碗汤
云原生搬砖师
Table of Contents

图片描述: 100

正文
#

今天来看三件事:

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取不到值,但是用 \ 转义和加双引号都可以。

-------莫愁前路无知己 天下谁人不识君-------

相关文章

go语言生成可执行文件
·629 字·2 分钟·
Golang
slf4j打印日志必须的三个依赖包
·405 字·1 分钟·
Java Slf4j
MySql镜像安装
·1111 字·3 分钟·
Mysql Docker
java子类调用父类构造器函数
·1126 字·3 分钟·
Java
shell脚本批量调用接口
·206 字·1 分钟·
Shell
linux通过VMware和主机相连连接互联网
·270 字·1 分钟·
Linux

公众号二维码