如何简化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
相关产品推荐
相关产品推荐

