利用go语言进行HTTP编程的过程中,我们会使用net/http
包,提供了强大的HTTP客户端和服务器功能,使得编写高性能的网络应用程序变得轻而易举。Go语言也给我们提供了服务端代码,固定输出hello world:
package main
import (
"fmt"
"net/http"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello world")
}
// http.ListenAndServe 接收 2 个参数,第一个参数是服务启动的地址,
// 第二个参数是 Handler,任何实现了 ServeHTTP 方法的对象都可以作为 HTTP 的 Handler。
func main() {
http.HandleFunc("/go", myHandler)
http.ListenAndServe("127.0.0.1:8000", nil)
}
在我们的使用中Handler的使用是最为常见的
在r *http.Request
中,提供了很多的方法供我们使用,例如:Method,URL,Header,Body,URL.Path,URL.RawQuery,URL.Host…
最近在学习过程中,遇到了req.URL.Path
,所以在这里对req.URL.Path以及req.URL.Path[:]
做一个总结。
代码
package main
import (
"fmt"
"net/http"
)
// w 给客户端回复数据 req 读取客户端发送的数据
func HandConn(w http.ResponseWriter, req *http.Request) {
fmt.Println("req.Method=", req.Method)
fmt.Println("req.URL=", req.URL)
fmt.Println("req.Header=", req.Header)
fmt.Println("req.Body=", req.Body)
fmt.Println("req.URL.Path=", req.URL.Path)
fmt.Println("req.URL.Path[len(gogogo):]=", req.URL.Path[len("/gogogo/"):])
fmt.Println("req.URL.RawQuery: ", req.URL.RawQuery)
fmt.Println("req.URL.Host: ", req.URL.Host)
w.Write([]byte("hello go"))
}
func main() {
//注册处理函数,用户连接,自动调用指定的处理函数
http.HandleFunc("/gogogo/abc/", HandConn)
http.ListenAndServe(":8000", nil)
}
结果
在浏览器输入http://127.0.0.1:8000/gogogo/abc/
以后会出现:
命令行会出现:
可以看出req.URL.Path
会输出端口以后的内容/gogogo/abc/
req.URL.Path[x:]
会输出端口指定x长度以后的内容,例如len(“/gogogo/”)长度以后的abc/