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
相关产品推荐
相关产品推荐

