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

Golang使用os/exec调用curl执行POST请求无法解析host如何解决?

错误原因

os/exec的Command函数会直接将每个参数传递给目标程序,不需要像手写shell命令那样额外加引号做转义。你给url、请求头、请求体参数都额外加了外层引号,导致curl拿到的URL是带双引号的"http://192.168.1.233:5534/current",解析时会把开头的"http识别为主机名,才会抛出无法解析主机的错误。

修正后的curl调用代码

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	var body string
	var FQDN string
	var contentType string
	var reqUrl string

	// 移除参数外层多余的双引号
	contentType = "Content-Type:application/json"
	reqUrl = "http://192.168.1.233:5534/current"
	DomainName := "test"
	IPAddress := "60.60.0.1"

	FQDN = DomainName + ".free5gc"
	body = `"DNS_ID":"DNS_1","Domain_ID":"Domain_1","Cell_ID":"Cell_1","Device_ID":"IOT1","IMEI":"ims-208930000000003","IPv4":"`+ IPAddress +`","IPv6":":::`+ IPAddress +`","Slice_ID":"121312","FQDN":"`+FQDN  +`"`

	fmt.Println(body)

	// 移除请求体外层多余的单引号
	c := exec.Command("curl","-X","POST","-H",contentType,"-d","{"+ body +"}",reqUrl,"-v")

	fmt.Println(c)
	c.Stdout = os.Stdout
	c.Stderr = os.Stderr
	err := c.Run()
	if err != nil {
		fmt.Println("Error: ", err)
	}
}

更优方案:使用Go原生net/http包发请求

不需要依赖系统curl命令,兼容性和可维护性更好,也避免手动拼接JSON出错:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

func main() {
	DomainName := "test"
	IPAddress := "60.60.0.1"
	FQDN := DomainName + ".free5gc"

	// 用map构造请求体,自动序列化JSON避免语法错误
	reqBody := map[string]string{
		"DNS_ID":    "DNS_1",
		"Domain_ID": "Domain_1",
		"Cell_ID":   "Cell_1",
		"Device_ID": "IOT1",
		"IMEI":      "ims-208930000000003",
		"IPv4":      IPAddress,
		"IPv6":      ":::" + IPAddress,
		"Slice_ID":  "121312",
		"FQDN":      FQDN,
	}
	jsonData, err := json.Marshal(reqBody)
	if err != nil {
		fmt.Println("JSON序列化失败:", err)
		return
	}

	req, err := http.NewRequest("POST", "http://192.168.1.233:5534/current", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Println("构造请求失败:", err)
		return
	}
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println("请求发送失败:", err)
		return
	}
	defer resp.Body.Close()

	fmt.Println("响应状态:", resp.Status)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:30:05