net / url包:从url中剥离查询

时间:2014-05-29 19:04:32

标签: 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())
}

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

3 个答案:

答案 0 :(得分:4)

我不确定这是否是您要求的,但您可以使用u.Path属性来获取网址的路径或网址指定的任何属性

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]

示例:

 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())
}

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

答案 1 :(得分:0)

其实你可以! URL type以这种方式定义:

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]

所以你可以使用:

u, _ := url.Parse()
result := u.Host + u.Path

答案 2 :(得分:0)

是的。如果您需要获取没有查询部分(也没有片段/锚)的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())
}

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

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