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

将 URL 路径与 path.Join() 结合

将 URL 路径与 path.Join() 结合

Go
达令说 2021-12-06 19:45:55
在 Go 中有没有办法像使用文件路径一样组合 URL 路径path.Join()?当我使用时path.Join("http://foo", "bar"),我得到http:/foo/bar.参见Golang Playground。
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

函数 path.Join 需要一个路径,而不是一个 URL。解析 URL 以获取路径并加入该路径:


u, err := url.Parse("http://foo")

u.Path = path.Join(u.Path, "bar.html")

s := u.String() // prints http://foo/bar.html

playground example


如果您组合的不仅仅是路径(例如方案或主机)或字符串多于路径(例如它包括查询字符串),则使用ResolveReference。


查看完整回答
反对 回复 2021-12-06
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

net/url 包中的 ResolveReference()


接受的答案不适用于包含 .html 或 .img 等文件结尾的相对 url 路径。ResolveReference() 函数是 go 中加入 url 路径的正确方法。


package main


import (

    "fmt"

    "log"

    "net/url"

)


func main() {

    u, err := url.Parse("../../..//search?q=dotnet")

    if err != nil {

        log.Fatal(err)

    }

    base, err := url.Parse("http://example.com/directory/")

    if err != nil {

        log.Fatal(err)

    }

    fmt.Println(base.ResolveReference(u))

}


查看完整回答
反对 回复 2021-12-06
?
千万里不及你

TA贡献1784条经验 获得超9个赞

一个简单的方法是修剪您不想要的 / 并加入。这是一个示例函数


func JoinURL(base string, paths ...string) string {

    p := path.Join(paths...)

    return fmt.Sprintf("%s/%s", strings.TrimRight(base, "/"), strings.TrimLeft(p, "/"))

}

用法是


b := "http://my.domain.com/api/"

u := JoinURL(b, "/foo", "bar/", "baz")

fmt.Println(u)

这消除了检查/返回错误的需要


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信