jeessy2/ddns-go · error

创建 dnsla 请求失败: %w

Error message

创建 dnsla 请求失败: %w

What it means

The Dnsla.request helper builds an http.NewRequest for the dnsla API. If request construction fails, it returns this wrapped error (创建 dnsla 请求失败) to create/modify. http.NewRequest only errors on an invalid method or an unparseable URL, so this almost always means the API address or method is malformed.

Source

Thrown at dns/dnsla.go:219

	}
	if jsonResult.Code == 200 {
		util.Log("更新域名解析 %s 成功! IP: %s", domain, ipAddr)
		domain.UpdateStatus = config.UpdatedSuccess
	} else {
		util.Log("更新域名解析 %s 失败! 异常信息: %s", domain, jsonResult.Msg)
		domain.UpdateStatus = config.UpdatedFailed
	}
}

// request sends a POST request to the given API with the given values.
func (dnsla *Dnsla) request(method, apiAddr string, values []byte) (body []byte, err error) {
	req, err := http.NewRequest(
		method,
		apiAddr,
		bytes.NewReader(values),
	)
	if err != nil {
		return nil, fmt.Errorf("创建 dnsla 请求失败: %w", err)
	}
	// 设置自定义 Headers
	byteBuff := []byte(dnsla.DNS.ID + ":" + dnsla.DNS.Secret)
	token := "Basic " + base64.StdEncoding.EncodeToString(byteBuff)
	req.Header.Set("Authorization", token)
	req.Header.Set("Content-Type", "application/json;charset=utf-8")
	// 4. 发送请求
	client := dnsla.httpClient
	resp, err := client.Do(req)
	if err != nil {
		return nil, fmt.Errorf("请求 dnsla 失败: %w", err)
	}
	defer resp.Body.Close()

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

View on GitHub (pinned to 5874c2e666)

Solutions

  1. Print the wrapped %w error — it names the exact invalid parameter (method or url)
  2. Check the dnsla API address configuration for scheme, typos, and surrounding whitespace (strings.TrimSpace)
  3. Ensure the method is a valid uppercase HTTP verb (http.MethodGet/Post/Put/Delete)
  4. Add a config/startup validation of apiAddr using url.Parse before issuing requests

Example fix

// before
req, err := http.NewRequest(method, apiAddr, bytes.NewReader(values))
if err != nil {
  return nil, fmt.Errorf("创建 dnsla 请求失败: %w", err)
}
// after
apiAddr = strings.TrimSpace(apiAddr)
if _, err := url.Parse(apiAddr); err != nil {
  return nil, fmt.Errorf("dnsla apiAddr 配置无效 %q: %w", apiAddr, err)
}
req, err := http.NewRequest(method, apiAddr, bytes.NewReader(values))
if err != nil {
  return nil, fmt.Errorf("创建 dnsla 请求失败: %w", err)
}
Defensive patterns

Strategy: validation

Validate before calling

addr := strings.TrimSpace(apiAddr)
u, err := url.Parse(addr)
if err != nil || u.Scheme == "" || u.Host == "" {
  return fmt.Errorf("dnsla apiAddr 无效: %q", addr)
}

Type guard

null

Try / catch

req, err := http.NewRequest(method, apiAddr, bytes.NewReader(values))
if err != nil {
  return nil, fmt.Errorf("创建 dnsla 请求失败: %w", err) // log %w to see which param is invalid
}

Prevention

When it happens

Trigger: create or modify call request() with an invalid/empty apiAddr URL or an unsupported HTTP method string (e.g. lowercase method or containing whitespace), making http.NewRequest return an error.

Common situations: Misconfigured dnsla API base URL (typo, missing scheme like 'https://'); config value with trailing spaces/newline; code change passing a bad method constant.

Related errors


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