# 实现golang http proxy

## 流程步骤

| 步骤 | 动作 |
| ------ | ----- |
| 1 | 创建一个http服务器来接收客户端请求 |
| 2 | 创建一个http客户端来处理代理请求 |
| 3 | 将客户端的请求通过代理发送到目标服务器 |
| 4 | 将目标服务器的响应通过代理发送给客户端 |

## 代码示例

### 步骤1:创建一个http服务器

```go
package main

import (
"net/http"
"log"
)

func handler(w http.ResponseWriter, r *http.Request) {
log.Println("Received request from client")
// 处理客户端请求的逻辑
}

func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```

在这段代码中,我们创建了一个简单的http服务器并监听在8080端口,当有客户端发起请求时,会调用handler函数处理请求。

### 步骤2:创建一个http客户端

```go
package main

import (
"net/http"
"log"
)

func main() {
client := &http.Client{}
req, _ := http.NewRequest("GET", "http://example.com", nil)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
// 处理代理请求的逻辑
}
```

在这段代码中,我们创建了一个http客户端,发送一个GET请求到"http://example.com",并处理代理请求的逻辑。

### 步骤3:处理代理请求

```go
package main

import (
"net/http"
"net/http/httputil"
"net/url"
"log"
)

func handler(w http.ResponseWriter, r *http.Request) {
targetURL, _ := url.Parse("http://example.com")
proxy := httputil.NewSingleHostReverseProxy(targetURL)
proxy.ServeHTTP(w, r)
}

func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```

在这段代码中,我们使用httputil包创建了一个反向代理,将客户端请求转发到目标服务器"http://example.com"。

### 步骤4:处理目标服务器响应

```go
package main

import (
"net/http"
"net/http/httputil"
"net/url"
"log"
)

func handler(w http.ResponseWriter, r *http.Request) {
targetURL, _ := url.Parse("http://example.com")
proxy := httputil.NewSingleHostReverseProxy(targetURL)
proxy.ServeHTTP(w, r)
log.Println("Proxying request to target server")
}

func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
```

在这段代码中,我们在处理代理请求的逻辑中添加了打印日志的代码,以便在代理请求发送给目标服务器时进行跟踪。

通过以上步骤,你可以实现一个简单的golang http代理服务器。希望这篇文章能够帮助你理解如何实现golang http代理。