在golang中如何拆分URL并从解码的组件编码回URL。任何完成这项工作的包裹?
net/url仅对解码网址有帮助。我想修改HOST
和PORT
并重新创建网址。我的问题源于我收到IPV6:port
而没有方括号的情况。我们假设我的格式为IPV6:port
:
aaa:abbb:cccc:dddd:0000:0000:00aa:bbbb:8080/static/silly.html
我想用括号arround IPV6地址重建URL。
答案 0 :(得分:4)
我认为这是不可能的。例如,如果你得到:
2001:db8::1:80
如何判断IP地址是否
2001:db8::1
或者:
2001:db8::1:80
这就是RFC 5952建议使用括号(或其他一些字符)来区分IP地址和端口号的原因。
因此,如果可能的话,我建议你忽略这种模棱两可的格式。
<强>更新强>
实际上,如果您确定能够区分这两个部分,那么就可以做到你想要的,也就是说,你可以对角色:
中出现的8个事件进行详细计算。
if strings.Count(url, ":") == 8 {
split := strings.Split(url, ":")
url = "[" + strings.Join(split[:8], ":") + "]:" + split[8]
}
但是,这可能不是处理这种网址格式的最佳方法......
答案 1 :(得分:0)
您可以使用标准net
包来帮助完成[Playground] [http://play.golang.org/p/wz0g7rgdU4]
我使用net.ParseIP
和net.JoinHostPort
package main
import (
"fmt"
"net"
"strings"
)
func splitLastColumn(host string) (string, string, string) {
idx := strings.Index(host, "/")
col_idx := strings.LastIndex(host[:idx], ":")
return host[:col_idx], host[col_idx+1 : idx], host[idx:]
}
func main() {
ipstr := "aaa:abbb:cccc:dddd:0000:0000:00aa:bbbb:8080/static/silly.html"
host, port, path := splitLastColumn(ipstr)
ip := net.ParseIP(host)
if ip == nil {
fmt.Println("invalid addr ")
}
fmt.Println(ip, host, port, path)
fmt.Println(net.JoinHostPort(host, port))
}