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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:26:01