一、handle案例
1、main.go如下,http访问:127.0.0.1:9990/static/mytest.txt
package main import ( "net/http" ) func main(){ addr :=":9990" //www目录和main文件在同一级,查找www目录下的static文件下的mytest.txt文件 http.Handle("/static/",http.FileServer(http.Dir("./www"))) http.ListenAndServe(addr,nil) }
2、handle接口如下:
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }
第二个参数是Handler这个接口, 这个接口有一个ServeHTTP()的方法
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
所以这个方法使用的时候需要自己去定义struct实现这个Handler接口。
package main import ( "net/http" "log" ) type httpServer struct { } func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte(r.URL.Path)) } func main() { var server httpServer http.Handle("/", server) log.Fatal(http.ListenAndServe("localhost:9000", nil)) }
ServeHTTP(w http.ResponseWriter, r *http.Request)返回结果方式有:
第一种:w.Write([]byte(r.URL.Path))
func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Write([]byte(r.URL.Path)) }
第二种:fmt.Fprintln
func (server httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "你好世界!!!") }
二、handlefunc案例
package main import ( "net/http" "log" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(r.URL.Path)) }) log.Fatal(http.ListenAndServe("localhost:9000", nil)) }
r *http.Request返回值分析
r.Method //返回请求方法 r.URL //返回请求url r.Proto //返回请求协议
请求:http://127.0.0.1:9000/?a=5&b=6
r.ParseForm //解析
r.Form //返回请求的数据a,b
等价于r.FormValue
三、http上传文件
1、上传文件
http.HandleFunc("/form-data/", func(w http.ResponseWriter, r *http.Request) { r.ParseMultipartForm(10*1024*1024) fmt.Println(r.MultipartForm.File) for k,fileHeaders := range r.MultipartForm.File { fmt.Println("file",k) for idx,fileHeader :=range fileHeaders { fmt.Printtln(idx,fileHeader.Filename,fileHeader.Header,fileHeader.Size) if file,err :=fileHeader.Open();err ==nil{ defer file.Close() io.Copy(os.Stdout,file) fmt.Println() } } } }
2、输出文件内容
http.HandleFunc("/form-data/", func(w http.ResponseWriter, r *http.Request) { f,fh,_ :=r.FormFile("a") fmt.Println(fh.Filename,fh.Header,fh.Size) io.Copy(os.Stdout,f) fmt.Println() f,fh,_ =r.FormFile("a") fmt.Println(fh.Filename,fh.Header,fh.Size) io.Copy(os.Stdout,f) fmt.Println() }
四、重定向跳转URL
func main() { http.HandleFunc("/redirect/", func(w http.ResponseWriter, r *http.Request) { //重定向跳转到 /home/ http.Redirect(w, r, "/home/", http.StatusFound) }) http.HandleFunc("/home/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "home") }) log.Fatal(http.ListenAndServe("localhost:9099", nil)) }
五、客户端访问请求
例子1、书写服务端
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(r.URL.Path)) fmt.Println(r.Method) //返回请求方法 fmt.Println(r.URL) //返回请求url fmt.Println(r.Proto) //返回请求协议<br><br>请求:http://127.0.0.1:9000/?a=5&b=6<br>r.ParseForm fmt.Fprintln(w,time.Now()) }) log.Fatal(http.ListenAndServe("localhost:9000", nil)) }
书写客户端
package main import ( "fmt" "io" "log" "net/http" "os" ) func main(){ url :="http://127.0.0.1:9000/" resp,err :=http.Get(url) if err !=nil{ log.Fatal(err.Error()) } fmt.Println(resp.Proto) fmt.Println(resp.StatusCode) fmt.Println(resp.Header) io.Copy(os.Stdout,resp.Body) }
例子2、书写服务端
package main import ( "fmt" "net/http" "log" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(r.URL.Path)) fmt.Fprintln(w,time.Now()) r.ParseForm() //接收来自客户端的请求 fmt.Println(r.Form.Get("a")) fmt.Println(r.Form.Get("b")) }) log.Fatal(http.ListenAndServe("localhost:9000", nil)) }
书写客户端,通过get类型向http://127.0.0.1:9000/?a=1&b=2"提交数据
package main import ( "fmt" "io" "log" "net/http" "os" ) func main(){ url :="http://127.0.0.1:9000/?a=1&b=2" resp,err :=http.Get(url) if err !=nil{ log.Fatal(err.Error()) } fmt.Println(resp.Proto) fmt.Println(resp.StatusCode) fmt.Println(resp.Header) io.Copy(os.Stdout,resp.Body) }
六、post提交数据
提交数据格式 http://127.0.0.1:9000/form?name=小明
1、书写服务端
package main import ( "fmt" "log" "net/http" ) func main() { http.HandleFunc("/form", func(w http.ResponseWriter, r *http.Request) { r.ParseForm() fmt.Println(r.PostFormValue("name")) fmt.Println(r.PostFormValue("sex")) //返回一个map fmt.Println(r.Form) }) log.Fatal(http.ListenAndServe("localhost:9000", nil)) }
2、客户端发送请求,postman测试