កំណត់ប្រូកស៊ីដាច់ដោយឡែកសម្រាប់ HTTP client ក្នុង Go
ក្លូន transport លំនាំដើមរបស់ Go កំណត់ ProxyURL សម្រាប់ IP ដែលបានជ្រើស និងកុំប្តូរឥរិយាបថរបស់ client ផ្សេង។
transport របស់ HTTP client ក្នុង Go ជាអ្នកជ្រើសប្រូកស៊ី។ ក្លូន transport ស្តង់ដារមុនកែប្រែ ដើម្បីឱ្យអ្នកប្រើ client លំនាំដើមផ្សេងទៀតរក្សាផ្លូវដើមរបស់ខ្លួន។
package main
import (
"fmt"
"io"
"log"
"net/http"
"net/url"
"time"
)
func main() {
proxyURL, err := url.Parse("http://203.0.113.10:8080")
if err != nil {
log.Fatal(err)
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
defer transport.CloseIdleConnections()
client := &http.Client{
Transport: transport,
Timeout: 15 * time.Second,
}
response, err := client.Get("https://example.com/")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
fmt.Println(response.StatusCode)
if _, err := io.Copy(io.Discard, response.Body); err != nil {
log.Fatal(err)
}
}
អាសយដ្ឋាននេះជាតម្លៃគំរូសម្រាប់ឯកសារ។ ប្តូរវាទៅជា IP និងច្រកប្រូកស៊ី HTTP ពិត ដូចជាជម្រើសពីបញ្ជីប្រូកស៊ី HTTP។ ឧទាហរណ៍ប្រើតែបណ្ណាល័យស្តង់ដាររបស់ Go ប៉ុណ្ណោះ សំណើប្រូកស៊ី HTTP នេះមិនត្រូវការកញ្ចប់ SOCKS ឬអថេរបរិស្ថានសម្រាប់ដំណើរការទាំងមូលទេ។
ហេតុអ្វីមិនកែ DefaultTransport ដោយផ្ទាល់?
transport លំនាំដើមត្រូវបានប្រើរួមគ្នា។ កែវាអាចប្តូរឥរិយាបថកូដដែលមិនធ្លាប់ស្នើប្រើប្រូកស៊ីរបស់អ្នក ហើយកែពេលមានសំណើកំពុងប្រើវាបង្កបញ្ហាដំណើរការស្របគ្នាដែលអាចជៀសវាងបាន។ transport ផ្ទាល់ធ្វើឱ្យផ្លូវជាផ្នែកនៃការកំណត់ client នេះ។
http.ProxyURL ត្រឡប់ឧបករណ៍ជ្រើសដែលតែងជ្រើស URL ដែលបានផ្តល់។ វាខុសពីឧបករណ៍ជ្រើសបរិស្ថានលំនាំដើម ដែលគិតអំពីអថេរប្រូកស៊ី និងច្បាប់រំលង។ បើអ្នកចង់សាកល្បងធាតុ HTTP ជាក់លាក់មួយក្នុងបញ្ជី ឧបករណ៍ជ្រើសដែលកំណត់ច្បាស់នឹងលុបប្រភពមិនច្បាស់នេះ។
បិទការឆ្លើយតប និងប្រើ client ឡើងវិញ
ឧទាហរណ៍អានតួការឆ្លើយតបដល់ចប់ រួចបិទវា។ អានទាំងស្រុងជួយ transport ប្រើការតភ្ជាប់ឡើងវិញពេលអាចធ្វើបាន។ ក្នុងកម្មវិធីដែលមានសំណើច្រើនតាមប្រូកស៊ីដូចគ្នា រក្សា client និង transport ជំនួសការបង្កើតគូថ្មីសម្រាប់សំណើនីមួយៗ។
រយៈពេលកំណត់របស់ client មិនគ្របដណ្តប់តែបើកសុកកែតទេ វាក៏កំណត់វដ្តជីវិតសំណើ រួមទាំងអានតួការឆ្លើយតប។ កំហុសអាននៅតែត្រូវដោះស្រាយក្រោយ Get ត្រឡប់។ ស្ថានភាពដូចជា 403 មិនមែនជាកំហុស transport របស់ Go ទេ ដូច្នេះពិនិត្យ StatusCode ដាច់ពី err។