Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menulis permintaan proksi HTTP menggunakan Golang

Cara menulis permintaan proksi HTTP menggunakan Golang

PHPz
PHPzasal
2023-04-26 16:58:391849semak imbas

Kuasa bahasa Golang terletak pada kecekapan tinggi dan keupayaan pengaturcaraan rangkaian yang berkuasa. Antaranya, permintaan proksi HTTP adalah salah satu masalah yang sering dihadapi oleh pembangun.

Dalam artikel ini, kami akan meneroka cara menulis permintaan proksi HTTP menggunakan Golang. Kami akan mencapai ini melalui langkah berikut:

  1. Fahami cara permintaan proksi HTTP berfungsi
  2. Tulis kod permintaan proksi HTTP
  3. Tambah fungsi pengesahan proksi
  4. Selesaikan masalah biasa dengan permintaan proksi

Fahami cara permintaan proksi HTTP berfungsi

Permintaan proksi HTTP ialah protokol komunikasi rangkaian yang membolehkan pelanggan menghantar permintaan melalui pelayan proksi untuk mengakses sasaran laman web. Pelayan proksi ini menyekat komunikasi terus antara klien dan pelayan sasaran dengan memajukan permintaan dan respons. Terdapat dua jenis pelayan proksi: proksi hadapan dan proksi songsang.

Proksi hadapan ialah pelayan yang terletak di antara klien dan pelayan sasaran. Pelanggan menghantar permintaan kepada pelayan proksi, dan pelayan proksi memajukan permintaan kepada pelayan sasaran dan mengembalikan respons pelayan sasaran kepada klien. Menggunakan proksi hadapan boleh menyembunyikan alamat IP klien dan mengawal serta memantau data dalam rangkaian.

Proksi terbalik ialah pelayan yang terletak di antara pelayan sasaran dan klien. Majukan permintaan kepada pelayan terbaik untuk meningkatkan prestasi sistem, kebolehskalaan dan keselamatan. Proksi terbalik sering digunakan untuk pengimbangan beban untuk memastikan komunikasi rangkaian yang cekap.

Dalam artikel ini, kami akan memperkenalkan cara menulis kod permintaan proksi ke hadapan menggunakan Golang.

Menulis kod permintaan proksi HTTP

Seterusnya, kami akan memperkenalkan cara menggunakan Golang untuk menulis kod permintaan proksi HTTP:

  1. Pertama, kita perlu mengimport bersih pakej /http dan pakej fmt.
package main

import (
   "fmt"
   "net/http"
)
  1. Seterusnya, kita perlu menulis fungsi pemprosesan yang menerima dua parameter: satu ialah permintaan dan satu lagi ialah respons. Kod dalam fungsi akan menghantar permintaan dan mengembalikan respons.
 func handler(w http.ResponseWriter, r *http.Request) {
   response, err := http.Get("https://www.google.com")
   if err != nil {
       fmt.Fprintf(w, "Error Occured: %s", err.Error())
   }else {
       fmt.Fprintf(w, "<html><head><title>%s</title></head><body>", response.Status)
       fmt.Fprintf(w, "<h1>Status</h1>")
       fmt.Fprintf(w, "<pre class="brush:php;toolbar:false">%s
", response.Status)        fmt.Fprintf(w, "

Header

")        for k, v := range response.Header {            fmt.Fprintf(w, "
%s: %s
", k, v[0])        }        fmt.Fprintf(w, "

Body

")        body, _ := ioutil.ReadAll(response.Body)        fmt.Fprintf(w, "%s", body)        fmt.Fprintf(w, "")     } }

Dalam kod di atas, kami menggunakan fungsi http.Get untuk menghantar permintaan yang melawati tapak web google.com. Jika permintaan berjaya, kami menggunakan fungsi fmt.Fprintf untuk menulis hasil respons ke dalam respons. Jika permintaan gagal, mesej ralat dikembalikan.

  1. Sekarang, kita perlu mencipta pelayan HTTP. Kita boleh menggunakan fungsi http.HandleFunc untuk menghantar fungsi pengendali yang baru kita buat kepada pelayan supaya pelayan boleh mengendalikan permintaan daripada klien.
func main() {
   http.HandleFunc("/", handler)
   http.ListenAndServe(":9090", nil)
}

Dalam kod di atas, kami menggunakan fungsi http.HandleFunc untuk menghantar fungsi pengendali kepada pelayan supaya pelayan boleh mengendalikan permintaan klien. Kami juga mencipta pelayan HTTP menggunakan fungsi http.ListenAndServe, yang mendengar pada port 9090.

Selepas menjalankan kod di atas, apabila kami melawati http://localhost:9090, kami akan melihat bahawa program menghantar permintaan ke google.com dan respons dipaparkan dalam penyemak imbas kami.

Tambah fungsi pengesahan proksi

Kini, kami tahu cara menghantar permintaan proksi HTTP. Pada masa ini, jika kita perlu menggunakan pelayan proksi untuk menghantar permintaan ke tapak web, kita perlu mengakses pelayan proksi dan mengesahkan. Di bawah, kami akan menunjukkan cara menghantar permintaan HTTP ke pelayan proksi melalui program.

Pertama, kami perlu menambah alamat proksi HTTP pada program kami. Kami juga perlu menentukan alamat IP dan nombor port untuk pelayan proksi. Contohnya:

proxyUrl, err:= url.Parse("http://proxy-server-address:port")

Seterusnya, kami perlu mencipta klien HTTP yang mengandungi alamat proksi:

transport := &http.Transport{
   Proxy: http.ProxyURL(proxyUrl),
}

Dalam kod di atas, kami mencipta objek pengangkutan yang mengandungi proksi kami alamat. Kita boleh menggunakan objek ini untuk menghantar permintaan pengesahan kepada pelayan proksi.

Dalam contoh kod berikut, kami akan menggunakan fungsi http.NewRequest untuk menghantar permintaan dan mengesahkan:

  req, err := http.NewRequest("GET", "https://www.google.com", nil)
  req.Header.Set("Proxy-Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte("username:password")))
  client := &http.Client{Transport: transport}
  response, err := client.Do(req)
  if err != nil {
     fmt.Fprintf(w, "Error Occured: %s", err.Error())
  } else {}

Dalam kod di atas, kami menggunakan fungsi http.NewRequest untuk menghantar permintaan HTTP dan Hantar pengepala pengesahan ke pelayan proksi. Kami juga mencipta objek klien HTTP dan menggunakan objek ini untuk menghantar permintaan. Jika ralat berlaku semasa menghantar permintaan, fungsi pengendali akan mengeluarkan mesej ralat.

Menyelesaikan masalah biasa dengan permintaan proksi

Apabila menggunakan permintaan proksi HTTP, kami mungkin menghadapi beberapa masalah biasa.

  1. Majukan permintaan. Badan

Andaikan kita perlu menghantar permintaan POST dan menghantar kandungan fail dalam file.txt sebagai badan permintaan. Kami boleh menggunakan kod berikut:

  file, err := os.Open("file.txt")
  if err != nil {
      fmt.Fprintf(w, "Error Occured: %s", err.Error())
  }
  defer file.Close()
  req, err := http.NewRequest("POST", "http://example.com/upload", file)

Dalam kod di atas, kami menyediakan objek Fail yang membaca data file.txt dalam parameter ketiga fungsi http.NewRequest. Kami kemudian menggunakan objek ini sebagai badan permintaan POST.

Walau bagaimanapun, apabila menggunakan proksi HTTP untuk memajukan permintaan POST ke pelayan sasaran, data dalam badan permintaan akan hilang. Untuk ini, kita boleh menggunakan fungsi ReadAll dalam pustaka ioutil untuk membaca semua data badan permintaan dan menambahkannya pada badan permintaan baharu.

  body, err := ioutil.ReadAll(r.Body)
  if err != nil {
     fmt.Fprintf(w, "Error Occured while reading body: %s", err.Error())
  }
  req, err := http.NewRequest("POST", "http://example.com/upload", bytes.NewBuffer(body))

Dalam kod di atas, kami membaca kandungan semua badan permintaan dan menambahkannya pada kandungan permintaan HTTP baharu.

  1. Pengepala permintaan ke hadapan

Jika kita ingin memasukkan pengepala HTTP tertentu dalam permintaan seperti "Perujuk" atau "Ejen Pengguna" maka kita boleh terus Tetapkan pengepala dalam objek permintaan HTTP.

  req, err := http.NewRequest("GET", "http://example.com/image.jpg", nil)
  req.Header.Set("Referer", "http://www.google.com")

在上述代码中,我们使用http.NewRequest函数创建了一个GET请求,并设置了其中的“Referer”标头。

结论

在本文中,我们探讨了如何使用Golang编写HTTP代理请求代码。通过了解HTTP代理的工作原理,我们能够更好地理解如何使用Golang为代理请求添加身份验证。我们还演示了如何解决常见的代理请求问题,并向您展示了如何在请求中包含特定的HTTP标头。无论您是开发Web应用程序还是使用它来生产工作,这些技巧和技术都将为您的工作带来很大的便利。

Atas ialah kandungan terperinci Cara menulis permintaan proksi HTTP menggunakan Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn