文章目录
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