Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Combine URL paths with path.Join()

Tags:

url

path

go

Is there a way in Go to combine URL paths similarly as we can do with filepaths using path.Join()?

For example see e.g. Combine absolute path and relative path to get a new absolute path.

When I use path.Join("http://foo", "bar"), I get http:/foo/bar.

See in Golang Playground.

like image 742
Aleš Avatar asked Jan 08 '16 01:01

Aleš


2 Answers

The function path.Join expects a path, not a URL. Parse the URL to get a path and join with that path:

u, err := url.Parse("http://foo") u.Path = path.Join(u.Path, "bar.html") s := u.String() // prints http://foo/bar.html 

playground example

If you are combining more than the path (scheme or host for example) or the string is more than the path (it includes a query string for example), then use ResolveReference.

like image 116
Bayta Darell Avatar answered Sep 22 '22 03:09

Bayta Darell


ResolveReference() in net/url package

The accepted answer will not work for relative url paths containing file endings like .html or .img. The ResolveReference() function is the correct way to join url paths in go.

package main  import (     "fmt"     "log"     "net/url" )  func main() {     u, err := url.Parse("../../..//search?q=dotnet")     if err != nil {         log.Fatal(err)     }     base, err := url.Parse("http://example.com/directory/")     if err != nil {         log.Fatal(err)     }     fmt.Println(base.ResolveReference(u)) } 
like image 30
mmmkay Avatar answered Sep 24 '22 03:09

mmmkay