golang net/http编程

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处理请求
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值