我正在尝试向本地ipv6地址(通过mdns发现)发出“ GET”请求。问题是请求fails。这是为什么?
package main
import (
"fmt"
"net/http"
)
func main() {
url := "http://[fe80::cf5:b02f:27c3:2abe]:7070/kw/"
rsp, err := http.Get(url)
fmt.Println(rsp, err)
}
输出
<nil> Get http://[fe80::cf5:b02f:27c3:2abe]:7070/kw/: dial tcp [fe80::cf5:b02f:27c3:2abe]:7070: socket: Unknown protocol
答案 0 :(得分:1)
您正在尝试连接到IPv6链接本地地址,但是这些地址要求作用域ID有效。作用域ID通常是接口名称或接口编号(例如,在Linux上是enp4s0
或wlp5s0
;在Windows上是3
或12
)。
%
也需要转义,因为它出现在URL中。因此它将显示为%25
。
因此您的网址应显示为:
url := "http://[fe80::cf5:b02f:27c3:2abe%25interface]:7070/kw/"
interface
是您的作用域ID。
还请注意,尽管net/http
会很高兴地向IPv6链接本地地址文字发出HTTP请求,但Web浏览器不会。但是,它们将连接到名称,这些名称将解析为范围合理的链接本地地址。它们还将连接到全局(和ULA)IPv6地址文字。如果您最终将在项目中使用Web浏览器,请记住这一点。