今天使用Go做HTTP POST请求时,出现错误,提示first path segment in URL cannot contain colon。意思为URL中的第一个路径段不能包含冒号。

排查问题,发现Url实际上包含空格,才导致出现这样的错误。为防止出现,需要对url进行过滤处理。

示例

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func SyncDo(host string, mdId, openId string) (string, error) {
form := url.Values{
"mdId": {mdId},
"openId": {openId},
}
resp, err := http.PostForm(host, form)
if err != nil {
logs.Info("http.PostForm err=%s, host=%q, form=%v", err, host, form)
}

defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
str := fmt.Sprintf("notice url=%s, form=%v, resp=%s", host, form, string(body))
logs.Info(str)
return str, err
}

后排查问题为Url中前后含空格。

可以打印详细的地址,查看是否包含字符串

1
fmt.Printf("%q", host) 

解决办法可以使用函数去除空格

1
host = strings.TrimSpace(host)

Url解析

url.Parse()最好只用来解析标准URL,不能用来验证URL的正确性

1
2
3
4
5
6
7
8
9
IP1 := "www.baidu.com"
IP2 := "127.0.0.1"
IP3 := "127.0.0.1:8080"
parsedIP1 := net.ParseIP(IP1)
parsedIP2 := net.ParseIP(IP2)
parsedIP3 := net.ParseIP(IP3)
fmt.Println("net.ParseIP: ", parsedIP1, parsedIP2, parsedIP3)

// net.ParseIP: <nil> 127.0.0.1 <nil>

参考文章

: first path segment in URL cannot contain colon

https://blog.csdn.net/simatongming/article/details/78540104

https://stackoverflow.com/questions/3583103/network-path-reference-uri-scheme-relative-urls