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

TCP连接错误排查:调用SMS API发送POST请求失败

解决SocketError: getaddrinfo: No such host is known的问题

你遇到的这个SocketError核心原因很明确:给Net::HTTP.new传入了带https://前缀的完整URL,但这个方法的第一个参数只需要纯主机名(比如rest-api.moceansms.com),不需要协议前缀。当Ruby尝试解析https://rest-api.moceansms.com这个完整字符串为域名时,自然找不到对应的主机,就抛出了“no such host is known”的错误。

我们来拆解你代码里的问题:

  • 你定义的url = 'https://rest-api.moceansms.com'包含了https://,传给Net::HTTP.new(url,443)时,Ruby会把整个字符串当作主机去做DNS查询,这显然是错的。
  • 手动拆分URL的主机和路径容易出错,更稳妥的方式是用URI.parse来处理完整URL,它会自动帮你拆分主机、端口、路径等信息。

这里是修正后的代码,我还调整了错误捕获的逻辑(避免捕获所有Exception,而是针对性处理网络类错误):

require "net/http"
require "uri"

# 用URI.parse处理完整URL,自动拆分主机、路径等信息
uri = URI.parse('https://rest-api.moceansms.com/rest/1/sms')
params = {
  'mocean-api-key' => 'mykey',
  'mocean-api-secret' => 'secret',
  'mocean-to' => '60162211800',
  'mocean-from' => '63001',
  'mocean-text' => 'Hello world!!!'
}

begin
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true # HTTPS必须启用SSL

  request = Net::HTTP::Post.new(uri.request_uri)
  request.form_data = params unless params.empty?

  response = http.request(request)
  puts response.body # 打印响应体,方便查看API返回的具体内容
rescue SocketError => e
  raise "无法连接到主机:#{e.message}"
rescue Net::HTTPError => e
  raise "API请求失败:#{e.message}"
rescue => e
  raise "未知错误:#{e.message}"
end

另外给你几个调试建议:

  • 先在终端用ping rest-api.moceansms.com或者curl https://rest-api.moceansms.com/rest/1/sms测试网络连通性,确认主机确实可达。
  • 不要捕获顶层的Exception,它会包括所有错误(比如语法错误、系统信号等),针对性捕获SocketError、Net::HTTPError这类具体错误,更容易定位问题。
  • 打印response.body而不是直接打印response对象,能看到API返回的具体内容,方便排查请求参数是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:32:54