【问题标题】:type *url.URL has no field or method ParseRequestURItype *url.URL 没有字段或方法 ParseRequestURI
【发布时间】:2018-10-25 16:17:29
【问题描述】:

这是我的代码:

director := func(req *http.Request) {
    fmt.Println(req.URL)

    regex, _ := regexp.Compile(`^/([a-zA-Z0-9_-]+)/(\S+)$`)
    match := regex.FindStringSubmatch(req.URL.Path)
    bucket, filename := match[1], match[2]
    method := "GET"
    expires := time.Now().Add(time.Second * 60)

    signedUrl, err := storage.SignedURL(bucket, filename, &storage.SignedURLOptions{
        GoogleAccessID: user.GoogleAccessID,
        PrivateKey: []byte(user.PrivateKey),
        Method: method,
        Expires: expires,
    })
    if err != nil {
        fmt.Println("Error " + err.Error())
    }
    fmt.Println(signedUrl)
    req.URL.ParseRequestURI(signedUrl)
}

我想使用 ParseRequestURI 方法将 signedUrl 解析为 req.URL https://golang.org/pkg/net/url/#ParseRequestURI

但是编译的时候会报错: req.URL.ParseRequestURI undefined (type *url.URL has no field or method ParseRequestURI)

所以我尝试了req.URL.Parse,它有效。 https://golang.org/pkg/net/url/#Parse

这两个函数在文档中彼此接近。我找不到它们之间的任何显着差异。所以我不知道为什么一个有效而另一个无效。

我怎样才能使ParseRequestURI 工作?为什么一个有效而另一个无效?

【问题讨论】:

  • URL 类型上有一个Parse function 和一个Parse methodParseRequestURI是函数,只能作为函数调用。
  • @ThunderCat 谢谢。但是我怎么知道它是文档中的函数而不是方法?如上所述,我在文档中找不到 ParseParseRequestURI 之间的区别。
  • 文档在方法的签名中显示了一个接收者。
  • 我认为我打电话的“Parse”是https://golang.org/pkg/net/url/#URL.Parse不小心
  • 旁白:编译一次正则表达式(在director之外),而不是每次请求;这是缓慢而浪费的。如果您不想处理错误,请使用MustCompile

标签: go


【解决方案1】:

正如您提到的,以下函数调用不起作用:

req.URL.ParseRequestURI(signedUrl)

因为:

func ParseRequestURI(rawurl string) (*URL, error)

net/url 包下定义为包级函数(reference),因此不能使用type 调用。虽然正确的调用方式如下:

url.ParseRequestURI(signedUrl) // Here 'url' is from package name i.e. 'net/url'

另一方面,正如您提到的,您可以成功调用req.URL.Parse,因为Parse 是在package 级别定义的,即在'net/url'(reference) 以及type 级别对于类型*URL(reference)

Parsenet/url 包定义为:

func Parse(rawurl string) (*URL, error)

Parse 将 rawurl 解析为 URL 结构。

rawurl 可以是相对的(路径,没有主机)或绝对的 (从一个计划开始)。尝试解析主机名和路径 一个方案是无效的,但不一定会返回错误,因为 解析歧义。

Parse 类型 *URL 定义为:

func (u *URL) Parse(ref string) (*URL, error)

Parse 在接收者的上下文中解析 URL。提供的网址 可能是相对的,也可能是绝对的。 Parse 返回 nil,解析失败时出错, 否则返回值与 ResolveReference 相同。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2017-08-03
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多