go http

server端gin

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func boy(c *gin.Context) { //你所需要的东西全都封装在了gin.Context里面,包括http.Request和ResponseWriter
	c.String(http.StatusOK, "hi boy") //通过gin.Context.String返回一个text/plain类型的正文
}
func girl(c *gin.Context) {
	c.String(http.StatusOK, "hi girl")
}

func main() {
	// gin.SetMode(gin.ReleaseMode)        //发布模式,默认是Debug模式
	engine := gin.Default() //默认的engine已自带了Logger和Recovery两个中间件
	engine.GET("/", boy)
	engine.POST("/", girl)

	//路由分组
	oldVersion := engine.Group("/v1")
	oldVersion.GET("/student", boy) //http://localhost:5656/v1/student
	oldVersion.GET("/teacher", boy) //http://localhost:5656/v1/teacher

	newVersion := engine.Group("/v2")
	newVersion.GET("/student", girl) //http://localhost:5656/v2/student
	newVersion.GET("/teacher", girl) //http://localhost:5656/v2/teacher

	engine.Run(":5656")
}

 

client 并发访问

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"runtime"
	"sync"
)

func client() {
	if resp, err := http.Get("http://127.0.0.1:5656"); err != nil {
		panic(err)
	} else {
		defer resp.Body.Close()
		io.Copy(os.Stdout, resp.Body)
		fmt.Println("\n", resp.StatusCode) //resp有很多参数。200状态码
	}
}

func main() {
//并发100个协程,100次访问
	wg := sync.WaitGroup{}
	wg.Add(100)
	for i := 0; i < 100; i++ {
		go func() {
			defer wg.Done()
			client()
			fmt.Println("次数", i)
		}()

	}
	wg.Wait()
	fmt.Printf("当前存活的协程数量%d", runtime.NumGoroutine())
}

 

 

server端

package main

import (
	"fmt"
	"github.com/julienschmidt/httprouter"
	"io"
	"net/http"
	"os"
	"time"
)

func handle(method string, w http.ResponseWriter, r *http.Request, params httprouter.Params) {
	fmt.Printf("request method:%s\n", r.Method)
	fmt.Printf("request body:")
	io.Copy(os.Stdout, r.Body)
	fmt.Println()
	w.Write([]byte("Hi boy you request" + method))
}
func get(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
	handle("get", w, r, params)
}
func post(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
	time.Sleep(1 * time.Millisecond)
	io.Copy(os.Stdout, r.Body)
	for _, ck := range r.Cookies() {
		fmt.Println(ck.Name, ck.Value)
	}
	handle("post", w, r, params)
}
func panic(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
	var arr []int
	_ = arr[1] //数组越界panic
}

func main() {
	router := httprouter.New()
	router.GET("/", get)
	router.POST("/", post)
	router.POST("/user/:name/:type/*addr", func(rw http.ResponseWriter, request *http.Request, p httprouter.Params) {
		fmt.Printf("name:%s,type:%s,addr:%s\n", p.ByName("name"), p.ByName("type"), p.ByName("addr"))
	})

	router.ServeFiles("/file/*filepath", http.Dir("./http/static"))

	router.PanicHandler = func(w http.ResponseWriter, r *http.Request, err interface{}) {
		w.WriteHeader(http.StatusInternalServerError) //设置http response status
		fmt.Fprint(w, "error:%s", err)
	}
	router.GET("/panic", panic)

	//http.HandleFunc("/", HelloHandler)
	http.ListenAndServe(":5656", router)

}

 

 

 

client get-post-client.do-post

package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
	"time"
)

func client() {
	if resp, err := http.Get("http://127.0.0.1:5656"); err != nil {
		panic(err)
	} else {
		defer resp.Body.Close()
		io.Copy(os.Stdout, resp.Body)
		fmt.Println("\n", resp.StatusCode)
	}
}

func client_post() {
	body := "hello server"

	if resp, err := http.Post("http://127.0.0.1:5656/", "text/plain", strings.NewReader(body)); err != nil {
		panic(err)
	} else {
		defer resp.Body.Close()
		io.Copy(os.Stdout, resp.Body)
		fmt.Println("\n", resp.StatusCode)
	}
}

//client.do-post请求可以在request加多个额外的参数如cookie或者超时时间等
func client_do() {
	body := "hello server"
	request, err := http.NewRequest("POST", "http://127.0.0.1:5656/", strings.NewReader(body))
	if err != nil {
		fmt.Println(err)
		return
	}
	request.AddCookie(&http.Cookie{
		Name:  "abc",
		Value: "123",
	})
	client := http.Client{Timeout: 100 * time.Millisecond}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err)
		return
	} else {
		defer resp.Body.Close()
		io.Copy(os.Stdout, request.Body)
		fmt.Println(resp.StatusCode)
		fmt.Println(resp.Proto)
		for k, v := range resp.Header {
			fmt.Println(k, v[0])
		}
	}
}
func main() {

	/*
		wg := sync.WaitGroup{}
		wg.Add(20)
		for i := 0; i < 20; i++ {
			go func() {
				defer wg.Done()
				client_post()
			}()
		}
		wg.Wait()
		fmt.Printf("当前存活的协程数量%d", runtime.NumGoroutine())

	*/

	//get
	client()

	//post
	//client_post()

	//client.do_post请求
	client_do()
}

 

posted @ 2022-09-28 16:47  NeilyoX  阅读(51)  评论(0)    收藏  举报