Dengan pembangunan aplikasi web, teknologi baharu sentiasa muncul. Antaranya, bahasa golang telah menarik perhatian ramai kerana keselarasannya yang tinggi, sintaks yang ringkas dan mudah difahami, serta kelajuan penyusunan yang cepat. Dalam aplikasi web, permintaan sering dimajukan kepada API yang berbeza Jadi bagaimana untuk menggunakan golang untuk melaksanakan fungsi pemajuan permintaan? Artikel ini akan memperkenalkan cara menggunakan golang untuk melaksanakan pemajuan permintaan.
1. Prinsip dan kaedah pemajuan permintaan
Pemajukan permintaan merujuk kepada proses menghantar permintaan dari satu pelayan ke pelayan yang lain. Dalam keadaan biasa, kami akan menyelesaikan tugas pemajuan permintaan melalui pelayan proksi perantaraan. Pelayan proksi perantaraan ini akan menerima semua permintaan daripada pelanggan, kemudian memajukan permintaan ini ke pelayan api hujung belakang yang berbeza, dan akhirnya mengembalikan hasil respons kepada pelanggan.
Memandangkan golang dilengkapi dengan perpustakaan httpnya sendiri, anda boleh menggunakan perpustakaan ini untuk melaksanakan pemajuan permintaan. Terdapat dua kaedah pelaksanaan khusus:
1 Kelas http.Client
pakej http menggunakan kelas
untuk melaksanakan pemajuan permintaan adalah seperti berikut: http.Client
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { proxyUrl := "http://localhost:8080/" // 设置代理服务器地址 client := &http.Client{} req, _ := http.NewRequest("GET", "http://www.baidu.com", nil) // 构建请求结构体 req.Header.Set("Content-Type", "text/html;charset=UTF-8") req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0") resp, err := client.Do(req) // 发送请求 if err != nil { fmt.Printf("error is %v\n", err) } defer resp.Body.Close() body, err2 := ioutil.ReadAll(resp.Body) // 获取响应结果 if err2 != nil { fmt.Printf("error2 is %v \n", err2) } fmt.Println(string(body)) }``` 上述代码中,我们使用 `http.Client` 类来创建一个代理对象,并设置了代理服务器的地址。然后,构建了一个请求体 `req`,并且设置了请求头信息。最后,使用 `client.Do()` 方法将请求发送给 api 服务器,并通过 `ioutil.ReadAll()` 函数将响应结果转换为字符串类型,最终打印在控制台上。 2、httputil包的`httputil.ReverseProxy`类 利用 `httputil.ReverseProxy` 类实现请求转发,可以比较轻松的搭建出一个反向代理服务器。代码如下:
"log" "net/http" "net/http/httputil" "net/url"
server := http.Server{ Addr: ":8080", Handler: &httputil.ReverseProxy{ // 使用httputil.ReverseProxy搭建代理服务器 Director: func(req *http.Request) { target, _ := url.Parse("https://www.baidu.com/") req.URL.Scheme = target.Scheme // 设置请求上下文 req.URL.Host = target.Host req.Header.Set("X-Forwarded-Host", req.Header.Get("Host")) req.Host = target.Host }, }, } log.Fatal(server.ListenAndServe()) // 监听端口并启动代理服务器
`
kelas httputil.ReverseProxy
untuk memajukan permintaan yang diluluskan oleh hujung hadapan ke pelayan api hujung belakang. Gunakan fungsi Director
dalam kaedah Director
untuk menghuraikan alamat pelayan api, kemudian gunakan alamat pelayan api sebagai alamat sasaran permintaan dan tetapkan konteks permintaan. Akhir sekali, panggil kaedah url.Parse()
untuk memulakan pelayan dan mendengar pada port, menunggu permintaan pelanggan. ListenAndServe
, membina badan permintaan secara manual dan menetapkan maklumat pengepala permintaan. Kaedah kedua ialah menggunakan kelas http.Client
untuk membina pelayan proksi terbalik, yang lebih mudah dan lebih mudah. Ringkasnya, bagi pembangun yang perlu melaksanakan tugasan pemajuan permintaan, sila pilih kaedah pelaksanaan yang lebih sesuai mengikut keperluan anda. httputil.ReverseProxy
Atas ialah kandungan terperinci Cara menggunakan golang untuk melaksanakan pemajuan permintaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!