beego:API方法总结

	beego.Info(u.Ctx.Input.Protocol())  //获取用户请求的协议:HTTP/1.1
	beego.Info(u.Ctx.Input.URI()) //用户请求的RequestURI: /v1/apptodayRpt/UpALL
	beego.Info(u.Ctx.Input.URL()) //请求的URL地址: /v1/apptodayRpt/UpALL
	beego.Info(u.Ctx.Input.Scheme()) //请求的 scheme: http/https
	beego.Info(u.Ctx.Input.Domain()) //请求的域名:例如 beego.me, 192.168.0.120
	beego.Info(u.Ctx.Input.SubDomains()) //返回请求域名的根域名,例如请求是blog.beego.me-->返回 beego.me;192.168.0.120--> 192.168
	beego.Info(u.Ctx.Input.Host()) //请求的域名,和上面相同:例如 beego.me, 192.168.0.120
	beego.Info(u.Ctx.Input.Site()) //请求的站点地址,scheme+doamin的组合: http://192.168.0.10
	beego.Info(u.Ctx.Input.Method())  //请求的方法:GET,POST 等
	beego.Info(u.Ctx.Input.Is("POST")) //判断是否是某一个方法:是不是POST方法,注意必须大写
	beego.Info(u.Ctx.Input.IsGet()) //是不是Get请求
	beego.Info(u.Ctx.Input.IsPut()) //是不是Put请求
	beego.Info(u.Ctx.Input.IsPost()) //是不是Post请求
	beego.Info(u.Ctx.Input.IsAjax()) //判断是否是AJAX请求:false
	beego.Info(u.Ctx.Input.IsSecure()) //判断当前请求是否HTTPS请求:false
	beego.Info(u.Ctx.Input.IsWebsocket()) //判断当前请求是否 Websocket请求:false
	beego.Info(u.Ctx.Input.IsUpload()) //判断当前请求是否有文件上传:true
	beego.Info(u.Ctx.Input.IP())  //返回请求用户的 IP,如果用户通过代理,一层一层剥离获取真实的IP:192.168.0.102
	beego.Info(u.Ctx.Input.Proxy()) //返回用户代理请求的所有IP,如果没有代理,返回[]
	beego.Info(u.Ctx.Input.Port())  //返回请求的服务器端口:3000
	beego.Info(u.Ctx.Input.UserAgent()) //客户端浏览器的信息:Mozilla/5.0 (Linux; Android 5.1.1; vivo X7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 Html5Plus/1.0 (Immersed/24.0)
	beego.Info(u.Ctx.Input.Query("name")) //该函数返回 Get 请求和 Post 请求中的所有数据,和 PHP 中$_REQUEST 类似

u.Ctx.Input.Protocol()

获取用户请求的协议:HTTP/1.1

请求的站点地址:http:// 192.168.0.10

u.Ctx.Input.Site()

源码:

func (input *BeegoInput) Site() string {
	return input.Scheme() + "://" + input.Domain()
}

分析:Site是由Scheme与Domain拼接而来的

u.Ctx.Input.Scheme()

beego.Info(u.Ctx.Input.Header("X-Forwarded-Proto"))  //http
可以根据u.Ctx.Input.Header("X-Forwarded-Proto")判断的。

源码:

func (input *BeegoInput) Scheme() string {
	if scheme := input.Header("X-Forwarded-Proto"); scheme != "" {
		return scheme
	}
	if input.Context.Request.URL.Scheme != "" {
		return input.Context.Request.URL.Scheme
	}
	if input.Context.Request.TLS == nil {
		return "http"
	}
	return "https"
}

u.Ctx.Input.Host()&&u.Ctx.Input.Domain()&&u.Ctx.Input.SubDomains()

	beego.Info(u.Ctx.Input.Host()) //  192.168.0.120
	beego.Info(u.Ctx.Input.Domain()) //请求的域名:例如 beego.me, 192.168.0.120
	beego.Info(u.Ctx.Input.SubDomains()) //返回请求域名的根域名,例如请求是blog.beego.me-->返回 beego.me;192.168.0.120--> 192.168

u.Ctx.Input.Host()源码:192.168.0.120

func (input *BeegoInput) Host() string {
	if input.Context.Request.Host != "" {
		if hostPart, _, err := net.SplitHostPort(input.Context.Request.Host); err == nil {
			return hostPart
		}
		return input.Context.Request.Host
	}
	return "localhost"
}

u.Ctx.Input.Domain()源码:192.168.0.120

func (input *BeegoInput) Domain() string {
	return input.Host()
}

u.Ctx.Input.SubDomains()源码:192.168

func (input *BeegoInput) SubDomains() string {
	parts := strings.Split(input.Host(), ".")
	if len(parts) >= 3 {
		return strings.Join(parts[:len(parts)-2], ".")
	}
	return ""
}

从上面源码可以看出:Host与Domain是一回事。SubDomains只是截取主机的前2个而已。

请求的方法

    beego.Info(u.Ctx.Input.Method())  //请求的方法:GET,POST 等
	beego.Info(u.Ctx.Input.Is("POST")) //判断是否是某一个方法:是不是POST方法,注意必须大写
	beego.Info(u.Ctx.Input.IsGet()) //是不是Get请求
	beego.Info(u.Ctx.Input.IsPut()) //是不是Put请求
	beego.Info(u.Ctx.Input.IsPost()) //true
	beego.Info(u.Ctx.Input.IsHead())  //FALSE
	beego.Info(u.Ctx.Input.IsOptions())  //FALSE
	beego.Info(u.Ctx.Input.IsPatch()) //FALSE

IsHead, IsOptions,IsPatch不懂,以后遇上再说
源码


// Method returns http request method.
func (input *BeegoInput) Method() string {
	return input.Context.Request.Method
}
IsPatch
// Is returns boolean of this request is on given method, such as Is("POST").
func (input *BeegoInput) Is(method string) bool {
	return input.Method() == method
}

// IsGet Is this a GET method request?
func (input *BeegoInput) IsGet() bool {
	return input.Is("GET")
}

// IsPost Is this a POST method request?
func (input *BeegoInput) IsPost() bool {
	return input.Is("POST")
}

// IsHead Is this a Head method request?
func (input *BeegoInput) IsHead() bool {
	return input.Is("HEAD")
}

// IsOptions Is this a OPTIONS method request?
func (input *BeegoInput) IsOptions() bool {
	return input.Is("OPTIONS")
}

// IsPut Is this a PUT method request?
func (input *BeegoInput) IsPut() bool {
	return input.Is("PUT")
}

// IsDelete Is this a DELETE method request?
func (input *BeegoInput) IsDelete() bool {
	return input.Is("DELETE")
}

// IsPatch Is this a PATCH method request?
func (input *BeegoInput) IsPatch() bool {
	return input.Is("PATCH")
}

判断是否是AJAX请求IsAjax

u.Ctx.Input.IsAjax() False

源码:

func (input *BeegoInput) IsAjax() bool {
	return input.Header("X-Requested-With") == "XMLHttpRequest"
}

通过

 beego.Info(u.Ctx.Input.Header("X-Requested-With")) 【什么也没有打印出来】

这个判断是false,但是前端说是false,有???
待看:https://segmentfault.com/a/1190000004322487

判断当前请求是否HTTPS请求

u.Ctx.Input.IsSecure()

源码:

func (input *BeegoInput) IsSecure() bool {
	return input.Scheme() == "https"
}

判断当前请求是否 Websocket请求

u.Ctx.Input.IsWebsocket()

源码

func (input *BeegoInput) IsWebsocket() bool {
	return input.Header("Upgrade") == "websocket"
}

u.Ctx.Input.Header(“Upgrade”) 输出为空

HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理。这种通信模型有一个弊端:HTTP 协议无法实现服务器主动向客户端发起消息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数 Web 应用程序将通过频繁的异步JavaScript和XML(AJAX)请求实现长轮询。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。
WebSocket 就是为了解决这个问题出现的:WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
https://www.cnblogs.com/jingmoxukong/p/7755643.html

判断当前请求是否有文件上传

u.Ctx.Input.IsUpload()

源码:

func (input *BeegoInput) IsUpload() bool {
	return strings.Contains(input.Header("Content-Type"), "multipart/form-data")
}

beego.Info(u.Ctx.Input.Header("Content-Type"))  //multipart/form-data; boundary=------h1Jk4M

multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率

  • 以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将数据以URL编码的形式放在HTTP正文中,字段形式为fieldname=value,用&分隔每个字段。注意所有的字段都被作为字符串处理。
  • 如果要在MIDP客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,
  • multipart/form-data是在post基础上演变而来的;multipart/form-data于post方法的不同之处在于请求头和请求体
  • multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,Content-Type必须是multipart/form-data,同时还需要规定一个内容分割用于分割请求提中多个post的内容,如文件内容和文本内容是需要分隔开来的,不然接收方就无法解析和还原这个文件了,具体的头信息如下:Content-Type: multipart/form-data; boundary= b o u n d 。 其 中 {bound} 。其中 bound{bound} 是一个占位符,代表我们规定的分割符,可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。
  • 参考:http://www.cnblogs.com/tylerdonet/p/5722858.html
  • https://www.cnblogs.com/yydcdut/p/3736667.html

获取参数

u.Ctx.Input.Query(“name”)

u.Ctx.Input.Query(“name”) //该函数返回 Get 请求和 Post 请求中的所有数据,和 PHP 中$_REQUEST 类似
源码

func (input *BeegoInput) Query(key string) string {
	if val := input.Param(key); val != "" {
		return val
	}
	if input.Context.Request.Form == nil {
		input.Context.Request.ParseForm()
	}
	return input.Context.Request.Form.Get(key)
}

Query的结果是先去找Param,如果没有再去找Form,Form是Request里的一个字段,类型是 url.Values

u.Ctx.Input.Param(“name”)

//结果为空
源码

func (input *BeegoInput) Param(key string) string {
	for i, v := range input.pnames {
		if v == key && i <= len(input.pvalues) {
			return input.pvalues[i]
		}
	}
	return ""
}

query和param的区别:https://www.jianshu.com/p/7aa6abc69d21

Header

返回相应Header信息

    beego.Info("Content-Encoding:", u.Ctx.Input.Header("Content-Encoding"))
	beego.Info("Content-Language:", u.Ctx.Input.Header("Content-Language"))
	beego.Info("Content-Length:", u.Ctx.Input.Header("Content-Length"))  //实体主体的大小
	beego.Info("Content-Location:", u.Ctx.Input.Header("Content-Location"))
	beego.Info("Content-Range:", u.Ctx.Input.Header("Content-Range"))
	beego.Info("Content-MD5:", u.Ctx.Input.Header("Content-MD5"))
	beego.Info("Content-Type:", u.Ctx.Input.Header("Content-Type"))  //实体的媒体类型
	beego.Info("Allow:", u.Ctx.Input.Header("Allow"))

其它

Cookie

  • 返回请求中的 cookie 数据,例如 Cookie(“username”) ,就可以获取请求头中携带的 cookie 信息中 username 对应的值

Session

  • session 是用户可以初始化的信息,默认采⽤用了 beego 的 session 模块中的 Session 对象,用来获取存储在服务器端中的数据。

Body

  • 返回请求 Body 中数据,例如 API 应用中,很多用户直接发送 json 数据包,那么通过 Query 这种函数无法获取数据,就必须通过该函数获取数据。该函数已经beego1.5版本之后删除,目前可以通过RequestBody获取数据。

GetData

  • 用来获取 Input 中 Data 中的数据
    SetData
  • 用来设置 Input 中 Data 的值,上面 GetData 和这个函数都是用来方便用户在 Filter 中传递数据到 Controller 中来执行
    链接:https://www.jianshu.com/p/0e5180431295
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值