Windows Server下Rails 5.2使用Nokogiri报rb_sysopen错误求助
解决方案
错误原因
- 第一个
Errno::EINVAL错误:默认的open方法只能读取本地文件,无法处理HTTP/HTTPS协议的网络URL,需要先加载Ruby标准库open-uri获得网络资源读取能力。 - 第二个
private method 'open' called for URI:Module错误:你使用的Ruby 2.6版本中,URI.open类方法尚未公开,直接调用会触发私有方法访问报错。
可用代码示例
方案1:使用Kernel#open(兼容你的最初写法)
首先在代码顶部显式引入open-uri库,再调用原有逻辑即可:
# 引入依赖库(Rails环境下也建议显式声明) require 'open-uri' require 'nokogiri' target_url = "https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/categoryscheme/ESTAT/AGRIC" resource = Nokogiri::XML(open(target_url))
方案2:使用URI实例的open方法(避免模块私有方法报错)
如果你更倾向于使用URI相关的显式调用,可以先解析URL为URI实例再调用实例的open方法:
require 'open-uri' require 'nokogiri' target_uri = URI("https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1/categoryscheme/ESTAT/AGRIC") resource = Nokogiri::XML(target_uri.open)
异常排查补充
如果引入库后仍出现访问报错,可先排查以下问题:
- 确认Windows Server 2016的出站防火墙规则允许你的Ruby进程访问目标HTTPS地址
- 可先单独执行
puts open(target_url).read验证是否能正常获取接口返回内容,确认网络连通性后再传入Nokogiri解析
内容的提问来源于stack exchange,提问作者user1185081
相关产品推荐
相关产品推荐

