起因:
客户提供了一个https的接口,要求先做测试才能上线使用;
经过:
太简单了吧,祭出postman开始测试,从本机测试,返回ip没鉴权!哦哦,鉴权的是服务器,好吧。
在服务器上装个postman吧,安装就报错,windows2012上居然用不了postman,尴尬了!
做转发吧,发现转发实现不了https功能,可能有三方的可以转发https的,但不敢用。
无奈之下,祭出golang,自己来转发吧。
如是开始golang大法
main.go
import (
"fmt"
"io"
"io/ioutil"
"net"
"net/http"
"os"
"time"
)
var client *http.Client
var localAddr string
var remoteAddr string
func main() {
client = &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 120 * time.Second,
KeepAlive: 120 * time.Second,
}).DialContext,
MaxIdleConns: 1000,
MaxIdleConnsPerHost: 1000,
IdleConnTimeout: time.Duration(90) * time.Second,
},
Timeout: 20 * time.Second,
}
localAddr = os.Args[1]
remoteAddr = os.Args[2]
fmt.Println(localAddr, remoteAddr)
httpsServer(remoteAddr)
for {
time.Sleep(time.Second)
}
}
func httpsServer(remote_addr string) {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Println("user in.")
r2 := post(r, remote_addr)
if r2 != nil {
defer r2.Body.Close()
body2, _ := ioutil.ReadAll(r2.Body)
for k, v := range r2.Header {
w.Header().Set(k, v[0])
}
w.WriteHeader(r2.StatusCode)
io.WriteString(w, string(body2))
} else {
io.WriteString(w, "Request Data Error")
}
})
http.ListenAndServe(localAddr, nil)
}
func post(r *http.Request, remote_addr string) *http.Response {
reqUrl := remote_addr + r.URL.Path
fmt.Println(reqUrl)
request, _ := http.NewRequest(r.Method, reqUrl, r.Body)
for k, v := range r.Header {
request.Header.Set(k, v[0])
fmt.Println(k, ":", v)
}
response, err := client.Do(request)
if err != nil {
fmt.Println(err)
}
return response
}
编译:
go build main.go -o http转发.exe
在服务器上运行:
http转发.exe :8080 xxxx.xxx.com
再将postman的地址修改为到服务器的:8080端口,开始测试,一切OK!搞定!
golang大法好!