net/url包:从URL中删除查询参数

huangapple go评论88阅读模式
英文:

net/url package: strip query from url

问题

我只是想确保我没有在net/url包中漏掉什么东西。有没有一种方法可以获取URL而不包含查询参数,而不使用strings包来删除它?

package main

import (
	"fmt"
	"net/url"
)

func main() {
	u, _ := url.Parse("/url?foo=bar&foo=baz")
	fmt.Printf("完整的URL: %#v\n", u.String())
	fmt.Printf("查询参数: %#v", u.Query())
}

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

英文:

I just wanted to make sure I wasn't missing something on the net/url package. Is there a way to get the url without the query, without using using the strings package to strip it out?

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

答案1

得分: 9

我不确定这是否是你要求的内容,但你可以使用u.Path属性来获取URL的路径,或者使用URL指定的任何属性。

示例代码如下:

type URL struct {
    Scheme   string
    Opaque   string    // 编码的不透明数据
    User     *Userinfo // 用户名和密码信息
    Host     string    // 主机或主机:端口
    Path     string
    RawQuery string // 编码的查询值,不包括'?'符号
    Fragment string // 引用的片段,不包括'#'符号
}
// 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

英文:

I am not sure if this is what you are asking but you can use the u.Path attribute to get the path of the url or any of the attributes specified by 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]

Example:

 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

答案2

得分: 7

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

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

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

英文:

Yes. In case you need to get url without the query part (and without fragment/anchor) you can simply overwrite them, set to an empty string:

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

In comparison to using only u.Host + u.Path or u.Path in this case you will keep the rest of the url: protocol, username and password, host.

答案3

得分: 2

实际上你是可以的!URL类型是这样定义的:

type URL struct {
    Scheme   string
    Opaque   string    // 编码的不透明数据
    User     *Userinfo // 用户名和密码信息
    Host     string    // 主机或主机:端口
    Path     string
    RawQuery string // 编码的查询值,不包括 '?'
    Fragment string // 引用的片段,不包括 '#'
}
// scheme://[userinfo@]host/path[?query][#fragment]

所以你可以使用:

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

Actually you can! The URL type is defined this way:

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]

So you can use:

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

huangapple
  • 本文由 发表于 2014年5月30日 03:04:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/23941032.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定