网络代理对请求的影响

下面仅以 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 字段来进行代理的配置;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容