web-dev-qa-db-fra.com

Combinez les chemins d’URL avec path.Join ()

Existe-t-il un moyen dans Go de combiner les chemins d’URL de la même manière que nous pouvons le faire avec des chemins de fichiers en utilisant path.Join()?

Par exemple, voir par exemple Combinez chemin absolu et chemin relatif pour obtenir un nouveau chemin absolu

Quand j'utilise path.Join("http://foo", "bar"), j'obtiens http:/foo/bar

Voir dans Aire de jeux Golang .

23
Aleš

Pathункция path.Join ожидает путь, ainsi que l'URL. Разобрать URL-адрес, чтобы получить путь, и присоединиться к нему:

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

playground example

Если вы комбинируете больше, чем путь (например, схема или хост) или строка больше, чем путь (например, включает строку запроса), используйте ResolveReference .

49
Cerise Limón

ResolveReference () dans le package net/url

La réponse acceptée ne fonctionnera pas pour les chemins d’URL relatifs contenant des terminaisons de fichier comme .html ou .img. La fonction ResolveReference () est la bonne façon de joindre des chemins d’URL au rendez-vous.

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))
}
19
mmmkay

J'ai écrit cette fonction utilitaire qui fonctionne pour mes besoins:

func Join(basePath string, paths ...string) (*url.URL, error) {

    u, err := url.Parse(basePath)

    if err != nil {
        return nil, fmt.Errorf("invalid url")
    }

    p2 := append([]string{u.Path}, paths...)

    result := path.Join(p2...)

    u.Path = result

    return u, nil
}

https://play.golang.org/p/-QNVvyzacMM

0
Brent