You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简化Ruby Net::HTTP代码,自动获取请求默认端口?

如何简化Ruby中Net::HTTP的默认端口判断逻辑?

嘿,当然有更简洁的写法啦!你这段手动判断HTTP/HTTPS协议、设置默认端口的逻辑完全可以交给Ruby标准库来处理,不用自己重复造轮子~

先贴一下你原来的代码方便对比:

if protocol == 'http'
  port = Net::HTTP.http_default_port()
  endpoint = Net::HTTP.new(host, port)
else
  port = Net::HTTP.https_default_port()
  endpoint = Net::HTTP.new(host, port)
  endpoint.use_ssl = true
end
request = Net::HTTP::Get.new("/item/#{item}")
request['Authorization'] = "Bearer #{key}"
response = endpoint.request(request)

方案一:用URI自动解析协议与端口

Ruby的URI模块可以自动识别协议对应的默认端口(HTTP默认80,HTTPS默认443),还能兼容自定义端口的场景,是最推荐的简化方式:

require 'uri'

# 先拼接完整URI,让URI模块帮我们解析所有信息
uri = URI.parse("#{protocol}://#{host}/item/#{item}")

# 创建请求对象,直接传入URI即可自动处理路径
request = Net::HTTP::Get.new(uri)
request['Authorization'] = "Bearer #{key}"

# 用Net::HTTP.start方法自动初始化连接,use_ssl直接根据URI的协议判断
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(request)
end

方案二:更简洁的一次性请求写法

如果你的请求逻辑比较简单,甚至可以用URI.open一步完成,连请求对象都不用手动创建:

require 'uri'

uri = URI("#{protocol}://#{host}/item/#{item}")
# 直接设置请求头并发起请求
uri.open('Authorization' => "Bearer #{key}") do |response|
  # 在这里处理响应,比如读取内容:response.read
end

为什么这两种方式更好?

  • 不用手动维护协议与默认端口的对应关系,避免写错端口的风险
  • 自动兼容自定义端口的场景(比如如果host是example.com:8080,URI会自动识别这个非默认端口)
  • 代码更简洁,逻辑更清晰,符合Ruby的“优雅”风格

内容的提问来源于stack exchange,提问作者0x777C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:06:18