在nba_stats gem中配置RestClient代理遇到URI无效错误
解决nba_stats gem配置Crawlera代理的问题
咱们先来拆解你遇到的两个问题,然后给出可行的解决方案:
为什么第一个代理配置会报错?
你第一次尝试的代理地址http://123@proxy.crawlera.com:8010触发URI::InvalidURIError,是因为URI规范要求用户认证部分必须是user:password格式——哪怕密码为空,也需要保留冒号来分隔用户名和密码。你的地址里只有用户名,没有冒号,导致URI解析失败。
为什么URI对象的尝试也失败?
你给uri.user赋值了带冒号的字符串("83a17a4219d543ef8800965d4293ac5d:"),这是错误的:URI对象的user属性只存储用户名,密码需要单独赋值给password字段。另外,RestClient的proxy属性需要的是字符串格式的代理地址,直接传URI对象可能存在兼容性问题。
正确的配置方式
因为nba_stats gem是通过RestClient::Resource发起请求的,而RestClient::Resource会继承全局的RestClient.proxy设置,所以只要正确配置全局代理就能生效。针对Crawlera的代理(不需要密码,只需要API密钥作为用户名),有两种正确写法:
方式1:直接用符合规范的字符串
# 替换成你的Crawlera API密钥 crawlera_api_key = "83a17a4219d543ef8800965d4293ac5d" # 关键:用户名后加冒号再跟@,表示密码为空 RestClient.proxy = "http://#{crawlera_api_key}:@proxy.crawlera.com:8010" # 正常初始化客户端并调用接口 client = NbaStats::Client.new play_by_play = client.play_by_play('0021301230')
方式2:用URI对象正确构建后转字符串
require 'uri' crawlera_api_key = "83a17a4219d543ef8800965d4293ac5d" uri = URI.parse("http://proxy.crawlera.com:8010") uri.user = crawlera_api_key uri.password = "" # 明确设置空密码 RestClient.proxy = uri.to_s # 转成字符串后赋值 client = NbaStats::Client.new play_by_play = client.play_by_play('0021301230')
验证逻辑
你看到的gem代码@resource ||= RestClient::Resource.new(endpoint),说明它创建的RestClient::Resource实例会自动使用全局的RestClient.proxy配置,所以只要全局代理设置正确,gem的请求就会走代理。
内容的提问来源于stack exchange,提问作者Adam12344
相关产品推荐
相关产品推荐

