zoukankan      html  css  js  c++  java
  • beego与curl三件事

    正文

    今天来看三件事:

    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
    

    在这里插入图片描述

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

    在这里插入图片描述

    但用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
    ", name2, age2)
    
    
    方法二:
    
    //获取?后面的参数 key不能加:
    name3 := this.GetString("name")
    age3 :=  this.GetString("age")
    
    fmt.Printf("Name3:%s Age3:%s
    ", 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代替&:

    在这里插入图片描述

    转义&:
    在这里插入图片描述

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

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



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


    扫码关注,精彩内容第一时间推给你

    image

  • 相关阅读:
    Cisco Packet Tracer 7.2
    "%Error opening tftp://255.255.255.255/network config"
    CPI 3.0磁盘空间不足!
    ASA Failover
    思科交换机配置单播MAC地址过滤
    WLC HA模式下的注意事项
    802.11r mixed mode
    IEEE 802.11r-2008
    iOS 上通过 802.11k、802.11r 和 802.11v 实现 Wi-Fi 网络漫游
    Flexconnect部署
  • 原文地址:https://www.cnblogs.com/liabio/p/11714100.html
Copyright © 2011-2022 走看看