为了账号安全,请及时绑定邮箱和手机立即绑定

解析带端口和不带方案的 URL

解析带端口和不带方案的 URL

Go
www说 2022-06-06 16:08:05
我正在尝试解析 Go 中的 URL 并从 URL 获取主机和方案。但是,在解析带有端口且没有方案的 URL 时,我得到了意想不到的结果。u, err := url.ParseRequestURI("hello.com:81")fmt.Println("host :",u.Host)fmt.Println("scheme :",u.Scheme)我得到了意想不到的结果host :scheme: hello.com我想要这个host : hello.com:80scheme:
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

net.URL 文档中定义的格式是以下之一:


[scheme:][//[userinfo@]host][/]path[?query][#fragment]

scheme:opaque[?query][#fragment]

是可选的scheme:,但双斜杠是该host字段的一部分。这意味着您输入的有效字符串是://hello.com:81这将导致:


u, _ := url.Parse("//hello.com:81")

fmt.Println("host:", u.Host)

// Output: host: hello.com:81

你需要把你的输入变成有效的东西。如果您知道字符串从不包含该方案,您可以简单地在前面加上//. 如果您有时只指定了一个方案,您可以尝试有条件地操作输入。


查看完整回答
反对 回复 2022-06-06
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

如果您需要处理仅包含主机和端口(没有方案和其他参数)的 URL,您可以使用以下代码:


   host, port, err := net.SplitHostPort("hello.com:81")

   fmt.Println("host:", host, "port:", port, "err:", err)

   // output: host: hello.com port: 81 err <nil>

注意SplitHostPort()不适合解析标准网址(符合[scheme:][//[userinfo@]host][/]path[?query][#fragment])


查看完整回答
反对 回复 2022-06-06
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

根据 go doc,表示的一般 url 形式为:


[scheme:][//[userinfo@]host][/]path[?query][#fragment]

方案后不以斜杠开头的 URL 被解释为:


scheme:opaque[?query][#fragment]

您的 URL 被解析为第二种格式。


您可以使用此方法获得预期的结果。在函数中,如果 URL 中没有方案,我们添加它,然后再次解析它以获得预期的结果。


func parseRawURL(rawurl string) (domain string, scheme string, err error) {

    u, err := url.ParseRequestURI(rawurl)

    if err != nil || u.Host == "" {

        u, repErr := url.ParseRequestURI("https://" + rawurl)

        if repErr != nil {

            fmt.Printf("Could not parse raw url: %s, error: %v", rawurl, err)

            return

        }

        domain = u.Host

        err = nil

        return

    }


    domain = u.Host

    scheme = u.Scheme

    return

}


查看完整回答
反对 回复 2022-06-06
  • 3 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号