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

