这是我的代码:
public class SecondPower implements Power {
boolean anotherParam;
boolean isAnotherParam() {
return anotherParam;
}
void setAnotherParam(boolean anotherParam) {
this.anotherParam = anotherParam;
}
@Override
public String toString() {
return "anotherParam:" + String.valueOf(anotherParam);
}
}
我想使用ParseRequestURI方法将signedUrl解析为req.URL https://golang.org/pkg/net/url/#ParseRequestURI
但是在编译时会引发错误:
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)
}
所以我尝试了req.URL.ParseRequestURI undefined (type *url.URL has no field or method ParseRequestURI)
,它可以工作。
https://golang.org/pkg/net/url/#Parse
这两个函数在文档中彼此接近。我找不到它们之间的任何重大差异。所以我不知道为什么一个有效,而另一个无效。
如何使req.URL.Parse
工作?为什么一个有效而另一个无效?
答案 0 :(得分:0)
正如您提到的,以下函数调用不起作用:
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
(reference)的*URL
级别。
Parse
中的 net/url
定义为:
func Parse(rawurl string) (*URL, error)
类型为Parse将rawurl解析为URL结构。
rawurl可以是相对的(没有主机的路径)或绝对的 (从方案开始)。尝试解析主机名和路径而无需 由于以下原因,方案无效,但不一定返回错误 解析歧义。
Parse
的 *URL
被定义为:
func (u *URL) Parse(ref string) (*URL, error)
Parse在接收者的上下文中解析URL。提供的URL 可以是相对的也可以是绝对的。解析返回nil,如果解析失败,则返回err, 否则,其返回值与ResolveReference相同。
希望对您有帮助。