jeessy2/ddns-go · error

请求失败: %v

Error message

请求失败: %v

What it means

Nowcn.request executes the prepared HTTP request with the shared client; a transport-level failure (connection refused, DNS failure, timeout, TLS error) is wrapped as '请求失败' (request failed). The provider response was never received.

Source

Thrown at dns/nowcn.go:261

	// 构造完整URL
	baseURL := "https://api.now.cn"
	fullURL := baseURL + apiPath + "?" + queryString

	// 创建HTTP请求
	req, err := http.NewRequest(method, fullURL, nil)
	if err != nil {
		return nil, fmt.Errorf("创建请求失败: %v", err)
	}

	// 设置请求头
	req.Header.Set("Accept", "application/json")

	// 发送请求
	client := t.httpClient
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("请求失败: %v", err)
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("读取响应失败: %v", err)
	}

	// 检查HTTP状态码
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("API请求失败,状态码: %d, 响应: %s", resp.StatusCode, string(body))
	}

	return body, nil
}

View on GitHub (pinned to 5874c2e666)

Solutions

  1. Check basic connectivity to api.now.cn (curl/ping) and DNS resolution
  2. Increase the timeout on t.httpClient if requests are timing out
  3. Retry with backoff for transient network errors
  4. Verify proxy environment variables/corporate proxy settings
  5. Check provider status for an outage

Example fix

// before
resp, err := client.Do(req)
if err != nil {
    return nil, fmt.Errorf("请求失败: %v", err)
}
// after
var netErr net.Error
resp, err := client.Do(req)
if err != nil {
    if errors.As(err, &netErr) && netErr.Timeout() {
        return nil, fmt.Errorf("请求超时: %w", err) // retryable
    }
    return nil, fmt.Errorf("请求失败: %w", err)
}
Defensive patterns

Strategy: retry

Validate before calling

// Go: pre-flight reachability check
conn, err := net.DialTimeout("tcp", "api.now.cn:443", 5*time.Second)
if err != nil { return fmt.Errorf("api.now.cn unreachable: %w", err) }
conn.Close()

Try / catch

body, err := nowcnClient.request(apiPath, params, method)
if err != nil {
    var netErr net.Error
    if errors.As(err, &netErr) && netErr.Timeout() {
        time.Sleep(time.Second)
        body, err = nowcnClient.request(apiPath, params, method) // single retry
    }
    if err != nil { return err }
}

Prevention

When it happens

Trigger: client.Do(req) returns err — network unreachable, DNS resolution failure for api.now.cn, connection timeout/reset, TLS handshake failure, or proxy misconfiguration.

Common situations: No internet/firewall blocking api.now.cn, local DNS issues, very short client timeout on t.httpClient, corporate proxy requiring configuration, transient provider outage.

Understand the failure class

Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.

Related errors


AI-assisted analysis of jeessy2/ddns-go@5874c2e666 (2026-09-03). Data as JSON: /api/errors/a296f6bac8068c52. Report an issue: GitHub.