这里只介绍方向代理
package main
import (
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
)
type Pxy struct{}
func (p *Pxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
trueServer := "http://localhost:2003"
url, err := url.Parse(trueServer)
if err != nil {
log.Println(err)
return
}
proxy := httputil.NewSingleHostReverseProxy(url)
log.Println(proxy)
proxy.ServeHTTP(w, r)
}
func main() {
http.Handle("/", &Pxy{})
log.Fatal(http.ListenAndServe(":2002", nil))
}
是不是看的有点懵圈,啊哈,这么短就能实现?但是使用go就是这么短小精悍。但是问题又来了:这客户端如何指定特定接口路径发起请求啊!不用担心
http.Handle("/",&Pxy{})
//作用:匹配当前目录下的所有路径。就好比如:能够匹配localhost:9090/test的路径.因此会自动识别客户端对代理服务器发起的请求
客户端发起请求的代码:
angular实现
1、为了减少跨域的问题,我再angular项目中配置了代理
a.在项目中创建proxy.config.json文件,并将如下代码写入
{
"/api":{
"target":"http://localhost:2002",
"secure":false,
"pathRewrite":{
"^/api":""
},
"loglevel":"debug"
}
}
b.在package.json文件中的”start“的位置修改代码
"start": "ng serve --proxy-config proxy.config.json",
2、在任意一个组件的ts文件中写入如下代码
goproxy(){
const httpOptions={
headers:new HttpHeaders({'Content-Type': 'application/json'})
};
var api = "/api/PostTest"
this.http.post(api, {"Text":"dfadsf","Picture":"dfasdfsda"},httpOptions).subscribe((Response)=>{
console.log("post请求的代理",Response)
})
}
在代码中,我们可以看到,是使用http://localhost:2002/postTest发起对代理服务器的请求。
- 代理服务器接收到客户端发来的请求,但是他本身不能对客户端进行响应数据,因此他会通过这个函数将请求发给真正的服务器。
func (p *Pxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
trueServer := "http://202.192.81.4:2003"
url, err := url.Parse(trueServer)
if err != nil {
log.Println(err)
return
}
proxy := httputil.NewSingleHostReverseProxy(url)
log.Println(proxy)
proxy.ServeHTTP(w, r)
}
package main
import (
"net/http"
"log"
"io/ioutil"
"encoding/json"
)
func PostTest(w http.ResponseWriter,r *http.Request){
w.Header().Set("Access-Control-Allow-Origin", "*") //允许访问所有域
w.Header().Add("Access-Control-Allow-Headers", "Content-Type") //header的类型
w.Header().Set("content-type", "application/json") //返回数据格式是json
body,err := ioutil.ReadAll(r.Body)
if err!=nil{
log.Println(err)
return
}
var data interface{}
json.Unmarshal(body,&data)
log.Println(data)
}
func main() {
http.HandleFunc("/PostTest", PostTest)
log.Fatal(http.ListenAndServe(":2003", nil))
log.Println("这里还能运行?")
}
从代码中,我们可以看到真正实现PostTest接口的是在这里接收的。这里处理完数据之后,因为真正服务器傲娇一点,他也不直接将数据发送给客户端,还是发送给了代理服务器。然后代理服务器在发送给客户端。
请发表评论