net/http
go使用net/http包创建服务器,首先注册处理函数 http.HandleFunc(),设置回调函数handler,然后绑定服务器监听地址http.ListenAndServe()
package main
import (
"fmt"
"net"
"net/http"
"os"
)
func home(w http.ResponseWriter, r *http.Request) {
// w 会写给客户端(浏览器)的数据
// r 从客户端(浏览器)读到的数据
fmt.Printf("%+v \n",r)
// GET请求
/*
&{Method:GET URL:/home Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[Accept: [*/*] Accept-Encoding:[gzip, deflate, br] Cache-Control:[no-cache] Connection:[keep-alive] Content-Lengt
h:[17] Content-Type:[application/json] Postman-Token:[fa7db432-cf3c-4c5a-b5f8-bb56b4c9fcab] User-Agent:[PostmanRuntime/7.26.8]] Body:0xc00004e4c0 GetBody:<nil> ContentLength:17 TransferE
ncoding:[] Close:false Host:127.0.0.1:8000 Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr:127.0.0.1:60713 RequestURI:/home TLS:<nil> Cancel:<nil> Response:<nil> c
tx:0xc00004e500}
*/
// post请求内容
/*
&{Method:POST URL:/home Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[Accept:[*/*] Accept-Encoding:[gzip, deflate, br] Cache-Control:[no-cache] Connection:[keep-alive] Content-Leng
th:[17] Content-Type:[application/json] Postman-Token:[2aa6adc0-c2c1-40d1-bd9c-a0c148628b75] User-Agent:[PostmanRuntime/7.26.8]] Body:0xc00004e600 GetBody:<nil> ContentLength:17 Transfer
Encoding:[] Close:false Host:127.0.0.1:8000 Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr:127.0.0.1:60713 RequestURI:/home TLS:<nil> Cancel:<nil> Response:<nil>
ctx:0xc00004e640}
*/
fmt.Println(r.Method) // 请求方法
fmt.Println(r.URL) // 请求url
fmt.Println(r.Header) // 请求头
fmt.Println(r.Body) // 请求体
fmt.Println(r.RemoteAddr) // 请求的请求地址IP:PORT
// 获取URL参数数据
qs := r.URL.Query()
value := qs.Get("key")
// 获取请求体json数据
defer r.Body.Close()
bs, _ := ioutil.ReadAll(r.Body) //获取post的数据
var data map[string]string
err := json.Unmarshal(bs, &data)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
value := data["key"]
// 设置响应头
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("Content-Disposition",
`attachment; filename="IntegrityReport.xlsx"`) // 用于返回文件的相应头设置
// 返回数据给客户端(浏览器)
w.Write([]byte("hello word"))
}
func myHandler(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.URL)
if r.URL.Path != "/"{
w.Write([]byte("url不存在"))
}
}
func main() {
// 注册回调函数,该回调函数会在访问服务器时自动调用,设置url与功能函数的对应关系
// 参数pattern string类型: url地址
// 参数handler func(ResponseWriter, *Request)类型: 回调函数
http.HandleFunc("/home", home) // handler func(ResponseWriter, *Request)
http.HandleFunc("/", myHandler) // 当路由 为 "/" 时, 改注册函数可接受 所有 未匹配的url请求
// 绑定监听地址
http.ListenAndServe("127.0.0.1:8000", nil) // handler为nil, 系统会调用默认的handler处理请求
}
实现根据url返回对应的文件(图片, 视频,音频等)
package main
import (
"fmt"
"io"
"net"
"net/http"
"os"
)
func sendFile(w http.ResponseWriter, path string) {
f, err := os.Open(path)
defer f.Close()
if err != nil{
fmt.Printf("os.Open err:", err)
w.Write([]byte("os.Open err"))
}
buf := make([]byte,4096)
for{
n, err := f.Read(buf)
if err != nil{
if err == io.EOF{
fmt.Println("文件发送完毕")
return // 文件发送完成后,结束函数
}else {
fmt.Println("f.Read err",err)
return // 出现错误后,结束函数
}
}
w.Write(buf[:n]) // 读多少写多少
}
}
func getJpg(w http.ResponseWriter, r *http.Request) {
path := "D:/PM/klbp/表关系/" + r.URL.String()
sendFile(w, path)
}
func main() {
http.HandleFunc("/", myHandler) // 当路由 为 "/" 时, 改注册函数可接受 所有 未匹配的url请求
http.HandleFunc("/1.png", getJpg)
http.HandleFunc("/xxx.mp4", getJpg)
http.HandleFunc("/klbp.xlsx", getJpg) // 下载excel
http.HandleFunc("/index.html", getJpg) // 返回html页面
// 绑定监听地址
http.ListenAndServe("127.0.0.1:8000", nil) // handler为nil, 系统会调用默认的handler处理请求
}