net/url 包:从 url 中删除查询

kwo*_*lfe 7 go

我只是想确保我没有遗漏 net/url 包中的某些内容。有没有办法在没有查询的情况下获取 url,而无需使用 strings 包将其剥离?

package main

import (
    "fmt"
    "net/url"
)

func main() {
    u, _ := url.Parse("/url?foo=bar&foo=baz")
    fmt.Printf("full uri: %#v\n", u.String())
    fmt.Printf("query: %#v", u.Query())
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/injlx_ElAp

fab*_*ioM 8

我不确定这是否是您要问的,但您可以使用该u.Path属性来获取 url 的路径或由 URL 指定的任何属性

type URL struct {
    Scheme   string
    Opaque   string    // encoded opaque data
    User     *Userinfo // username and password information
    Host     string    // host or host:port
    Path     string
    RawQuery string // encoded query values, without '?'
    Fragment string // fragment for references, without '#'
}
// scheme://[userinfo@]host/path[?query][#fragment]
Run Code Online (Sandbox Code Playgroud)

例子:

 package main

import (
    "fmt"
    "net/url"
)

func main() {
    u, _ := url.Parse("http://www.test.com/url?foo=bar&foo=baz#this_is_fragment")
    fmt.Println("full uri:", u.String())
    fmt.Println("scheme:", u.Scheme)
    fmt.Println("opaque:", u.Opaque)
    fmt.Println("Host:", u.Host)
    fmt.Println("Path", u.Path)
    fmt.Println("Fragment", u.Fragment)
    fmt.Println("RawQuery", u.RawQuery)
    fmt.Printf("query: %#v", u.Query())
}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/mijE73rUgw


Nik*_*Nik 5

是的。如果您需要在没有查询部分(并且没有片段/锚点)的情况下获取 url,您可以简单地覆盖它们,设置为空字符串:

package main

import (
    "fmt"
    "net/url"
)

func main() {
    u, _ := url.Parse("/url?foo=bar&foo=baz")
    fmt.Printf("full uri: %#v\n", u.String())
    fmt.Printf("query: %#v", u.Query())

    u.RawQuery = ""
    u.Fragment = ""

    fmt.Println("result url:", u.String())
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/RY4vlfjj3_5

与仅使用u.Host + u.Pathu.Path在这种情况下相比,您将保留 url 的其余部分:协议、用户名和密码、主机。