Rails调用Google Spaces接口时Net::HTTP::Post报ArgumentError错误
修复JRuby下Net::HTTP::Post初始化时的ArgumentError错误
在Rails 5.2 + JRuby 9.3.3.0环境下,使用Net::HTTP向Google Spaces发送通知时,代码能成功发出通知,但初始化Net::HTTP::Post对象的代码触发ArgumentError (wrong number of arguments calling method (given 1, expected 0))错误。
触发错误的代码行:
request = Net::HTTP::Post.new(uri.request_uri, header)
错误原因
JRuby 9.3.x版本中,Net::HTTP::Post.new对headers参数的处理逻辑与标准CRuby存在差异。当传入符号键的哈希(如{'Content-Type': 'application/json'})时,内部会错误地将符号键解析为方法调用,触发参数不匹配的异常。
解决方案
有两种可靠的修复方式:
方式1:单独设置请求头(推荐)
跳过初始化时传入headers的方式,改用Net::HTTPHeader的API单独设置请求头,避免JRuby的参数解析问题:
require 'net/http' require 'uri' require 'json' uri = URI.parse("https://chat.googleapis.com/v1/spaces/AAAAAAAAA/messages?key=AIzaSyDddsdHDSDS-WEfzqKqqsHI&token=OaX6LQKRyIC8aSUXH8cnuKZXAII%3D") data = { "text": "Bijendra-Test Notification!" } http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true # 初始化Post请求时只传入请求路径 request = Net::HTTP::Post.new(uri.request_uri) # 单独设置Content-Type请求头 request['Content-Type'] = 'application/json' request.body = data.to_json response = http.request(request)
方式2:使用字符串键的headers哈希
如果坚持在初始化时传入headers,将哈希的键改为字符串形式,避免JRuby将符号解析为方法调用:
require 'net/http' require 'uri' require 'json' uri = URI.parse("https://chat.googleapis.com/v1/spaces/AAAAAAAAA/messages?key=AIzaSyDddsdHDSDS-WEfzqKqqsHI&token=OaX6LQKRyIC8aSUXH8cnuKZXAII%3D") # 改用字符串键的哈希 header = {'Content-Type' => 'application/json'} data = { "text": "Bijendra-Test Notification!" } http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri.request_uri, header) request.body = data.to_json response = http.request(request)
补充说明
尽管当前请求仍能发送,但该错误会破坏代码的稳定性,可能在后续逻辑中引发未预期的异常。修复后既能消除错误,也能保证代码在JRuby环境下的兼容性。
内容的提问来源于stack exchange,提问作者Bijendra
相关产品推荐
相关产品推荐

