2013-02-02 34 views
29

Tôi đang cố gắng thiết lập ứng dụng khách HTTP để sử dụng proxy, tuy nhiên tôi không thể hiểu rõ cách thực hiện. Tài liệu có nhiều tham chiếu đến "proxy" nhưng không có chức năng nào dường như cho phép xác định proxy. Những gì tôi cần là một cái gì đó như thế này:Thiết lập proxy cho máy khách HTTP

client := &http.Client{} 
client.SetProxy("someip:someport") // pseudo code 
resp, err := client.Get("http://example.com") // do request through proxy 

Bất kỳ ý tưởng làm thế nào để làm điều này trong Go?

Trả lời

70

lukad là đúng, bạn có thể thiết lập các biến HTTP_PROXY môi trường, nếu bạn làm Go này sẽ sử dụng nó theo mặc định.

Bash:

export HTTP_PROXY="http://proxyIp:proxyPort" 

Go:

os.Setenv("HTTP_PROXY", "http://proxyIp:proxyPort") 

Bạn cũng có thể xây dựng http.Client của riêng bạn mà PHẢI sử dụng một proxy bất kể cấu hình của môi trường:

proxyUrl, err := url.Parse("http://proxyIp:proxyPort") 
myClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyUrl)}} 

này rất hữu ích nếu bạn không thể phụ thuộc vào cấu hình của môi trường, hoặc không muốn sửa đổi nó.

Bạn cũng có thể sửa đổi phương tiện mặc định được sử dụng bởi gói "net/http". Điều này sẽ ảnh hưởng đến toàn bộ chương trình của bạn (bao gồm cả máy khách HTTP mặc định).

proxyUrl, err := url.Parse("http://proxyIp:proxyPort") 
http.DefaultTransport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)} 
+0

Trong thực tế, tôi cần phải đồng thời gửi một số yêu cầu, mỗi yêu cầu sử dụng một proxy khác nhau, vì vậy giải pháp thứ hai của bạn có lẽ là những gì tôi cần. Tuy nhiên, nó không có vẻ là làm việc, tôi nhận được lỗi này cho tất cả các proxy: 'Nhận http://stackoverflow.com: http: lỗi kết nối với proxy 87.236.233.92:8080: GetServByName: Tên được yêu cầu là hợp lệ, nhưng không tìm thấy dữ liệu nào của loại được yêu cầu.' Bất kỳ ý tưởng nào có nghĩa là gì? –

+0

Tôi nhận được câu trả lời cho câu hỏi này ở đó - http://stackoverflow.com/q/14669958/561309 –

+0

FYI: 'url' nằm trong [net/url] (https://golang.org/pkg/net/url /) –

6

Đi sẽ sử dụng proxy được xác định trong biến môi trường HTTP_PROXY nếu được đặt. Nếu không, nó sẽ không sử dụng proxy.

Bạn có thể làm điều đó như thế này:

os.Setenv("HTTP_PROXY", "http://someip:someport") 
resp, err := http.Get("http://example.com") 
if err != nil { 
    panic(err) 
} 
+1

FYI - 'return' sau' panic' [dư thừa] (http://blog.golang.org/defer-panic-and-recover). –

2

Có thể bạn cũng có thể thử điều này:

url_i := url.URL{} 
url_proxy, _ := url_i.Parse(proxy_addr) 

transport := http.Transport{}  
transport.Proxy = http.ProxyURL(url_proxy)// set proxy 
transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //set ssl 

client := &http.Client{} 
client.Transport = transport 
resp, err := client.Get("http://example.com") // do request through proxy 
0

Đối với một cách khác, bạn cũng có thể sử dụng GoRequest trong đó có một tính năng mà bạn có thể thiết lập Proxy một cách dễ dàng đối với bất kỳ yêu cầu duy nhất.

request := gorequest.New() 
resp, body, errs:= request.Proxy("http://proxy:999").Get("http://example.com").End() 
resp2, body2, errs2 := request.Proxy("http://proxy2:999").Get("http://example2.com").End() 

Hoặc bạn có thể đặt toàn bộ cùng một lúc.

request := gorequest.New().Proxy("http://proxy:999") 
resp, body, errs:= request.Get("http://example.com").End() 
resp2, body2, errs2 := request.Get("http://example2.com").End() 
+0

gorequest không hỗ trợ vớ proxy –

Các vấn đề liên quan