3-9按照课程的代码好像返回的内容并没有被拦截修改

来源:4-9 返回内容随心改2

慕前端904247

2020-04-28

  • 描述 : 按照牛儿老师的课程步骤走了一边发现没有达到目的效果,反复勾兑了老师的代码后没有发现问题所在以下是效果图&httputil.ReverseProxy{Director: director,ModifyResponse:modifyfun},的modfiyfun似乎没有起到作用请老师指点一二

图片描述

  • 这个是server.go的代码
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

type RealServer struct {
	Addr string
}

func main() {
	//新建两个端口监听
	rs1 := &RealServer{Addr:"127.0.0.1:8081"}
	rs2 := &RealServer{Addr:"127.0.0.1:8082"}
	//启动运行
	rs1.Run()
	rs2.Run()
	//监听系统关闭的信号
	quit := make(chan os.Signal)
	signal.Notify(quit,syscall.SIGINT,syscall.SIGTERM)
	<-quit
}

//启动方式
func(r *RealServer) Run() {
	log.Println("Start HttpServer is "+ r.Addr)
	mux := http.NewServeMux()
	mux.HandleFunc("/",r.HelloHandle)
	mux.HandleFunc("/base/error",r.ErrorHandler)
	server := &http.Server{
		Addr:              r.Addr,
		WriteTimeout:time.Second*3,
		Handler: mux,
	}
	go func() {
		log.Fatal(server.ListenAndServe())
	}()
}

//处理的路由函数
func(r *RealServer) HelloHandle(w http.ResponseWriter,req *http.Request) {
	log.Println(req.Host)
	//构建请求路径
	urlpath:= fmt.Sprintf("http://%s%s\n",r.Addr,req.URL.Path)
	realIP := fmt.Sprintf("RemoteAddr=%s,X-Forwarded-For=%v,X-Readl-Ip=%v\n",
		req.RemoteAddr,req.Header.Get("X-Forwarded-For"),req.Header.Get("X-Real-Ip"))
	io.WriteString(w,urlpath)
	io.WriteString(w,realIP)
}

func (r *RealServer) ErrorHandler(w http.ResponseWriter,req *http.Request){
	upath:= "error Handler"
	w.WriteHeader(500)
	io.WriteString(w,upath)
}
  • 这个是customModifyResponproxy.go的代码
package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httputil"
	"net/url"
	"strings"
)

var add = "127.0.0.1:8085"

func main() {
	rs := "http://127.0.0.1:8082/base"
	//解析参数
	url1 ,err:= url.Parse(rs)
	if err != nil {
		log.Println(err)
	}
	proxy := httputil.NewSingleHostReverseProxy(url1)
	log.Println("Starting Listen is "+ add)
	log.Fatal(http.ListenAndServe(add,proxy))
}

//手动实现一个modify的方法
func NewSingleHostReverseProxy(target *url.URL) *httputil.ReverseProxy {
	//URL : http://127.0.0.1:8085/xxx?name=123
	//Host = 127.0.0.1:8085
	//Scheme = http
	//path = xxx
	//RayQuery = name=123
	targetQuery := target.RawQuery
	director := func(req *http.Request) {
		req.URL.Scheme = target.Scheme
		req.URL.Host = target.Host
		req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path)
		if targetQuery == "" || req.URL.RawQuery == "" {
			req.URL.RawQuery = targetQuery + req.URL.RawQuery
		} else {
			req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
		}
		if _, ok := req.Header["User-Agent"]; !ok {
			// explicitly disable User-Agent so it's not set to default value
			req.Header.Set("User-Agent", "")
		}
	}
	modifyfun := func(r *http.Response) error {
		oldPayload,err := ioutil.ReadAll(r.Body)
		if err !=nil {
			return err
		}
		//修改读取到的结构体信息
		newpayload:=[]byte("修改成功结果为:"+ string(oldPayload))
		//转换到新的body中
		r.Body = ioutil.NopCloser(bytes.NewBuffer(newpayload))
		//改写长度(因为重写的时候还是读取原来长度的所以要改写长度)
		r.ContentLength = int64(len(newpayload))
		fmt.Println(len(newpayload))
		r.Header.Set("Content-Length",fmt.Sprint(len(newpayload)))
		return nil
	}
	return &httputil.ReverseProxy{Director: director,ModifyResponse:modifyfun}
}

func singleJoiningSlash(a, b string) string {
	aslash := strings.HasSuffix(a, "/")
	bslash := strings.HasPrefix(b, "/")
	switch {
	case aslash && bslash:
		return a + b[1:]
	case !aslash && !bslash:
		return a + "/" + b
	}
	return a + b
}

写回答

1回答

牛儿吃草

2020-04-28

因为方法没有被调用。
proxy := httputil.NewSingleHostReverseProxy(url1)
替换为
proxy := NewSingleHostReverseProxy(url1)

0
1
慕前端904247
非常感谢!
2020-04-29
共1条回复

(打造简历金牌项目)Vue+Go 开发企业级微服务网关项目

简历中摒弃烂大街的培训机构项目,带你开发企业级微服务网关

1316 学习 · 352 问题

查看课程