下面仅以 clashX 举例
背景
在开启 clashX 时,通过 chrom 访问 https 是可以正常访问且能获取到数据。但是如果直接在终端使用 curl 或通过 go 语言写的 https 的请求都无法正常的进行访问请求。
产生问题的原因
经过测试发现 go 的请求代码以及 curl 直接在国外的服务器运行是可以做正常的访问请求的。说明本身发起请求的代码是没有问题的。那就只有一种情况,通过 curl 或 go 的代码请求流量没有走 clashX 代理。
curl 的请求添加代理
curl --proxy "http://user:pwd@127.0.0.1:1234" "http://httpbin.org/ip"
通过"--proxy"进行代理的配置
经过测试是可以进行数据访问的。
# 有用户名密码时
export http_proxy="http://user:pwd@127.0.0.1:1234"
export https_proxy="http://user:pwd@127.0.0.1:1234"
# 没有用户名密码
export http_proxy="http://127.0.0.1:1234"
export http_proxy="http://127.0.0.1:1234"
# 上面的设置用于全局代理,如果不需要刻意使用 unset 删除
unset http_proxy
unset https_proxy
go 发送请求走代理
go 的请求需要走代理的时候,需要配置 client 的 Transport
一下是实际代码示例:
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main(){
proxyUrl, err := url.Parse("http://127.0.0.1:7890")
if err != nil {
fmt.Println(err)
return
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxyUrl),
}
client := &http.Client{
Transport: transport,
}
url1 := "https://api.themoviedb.org/3/movie/changes?page=1"
req, _ := http.NewRequest("GET", url1, nil)
req.Header.Add("accept", "application/json")
res, err := client.Do(req) //
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
以上代码中通过向,client 添加 Transport 字段来进行代理的配置;
网友评论