# Join parts of a URL - joinpath?

**URL:** <https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441>\
**Category:** General Usage\
**Created:** [July 17, 2018, 4:03pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441 "2018-07-17T16:03:30Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [July 17, 2018, 4:03pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/1 "2018-07-17T16:03:30Z")

</div>

Hello,

I’d like to build a url like “[http://www.domain.com/get/data](http://www.domain.com/get/data)” from a Vector

```
parts = ["http://www.domain.com", "get", "data"]

```

At first sight, on a \*nix system I will do

```
julia> joinpath(parts...)
"http://www.domain.com/get/data"

```

but I think `joinpath` is system dependant ie on Windows it may use \ instead of /

Is there a function which always use “/” (even with Windows system)

With Python, we have `os.path.join` and `urllib.parse.urljoin`  
But I haven’t found a `join...` function in [GitHub - JuliaWeb/URIParser.jl: Uniform Resource Identifier (URI) parser in Julia](https://github.com/JuliaWeb/URIParser.jl)

Kind regards

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [July 17, 2018, 4:15pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/2 "2018-07-17T16:15:58Z")

</div>

I’m aware of

```
join(parts, "/")

```

but I wonder if a more “high level” function exists

---

<div class="post-metadata">

**Author:** ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)\
**Post date:** [July 17, 2018, 4:21pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/3 "2018-07-17T16:21:30Z")

</div>

Does [GitHub - JuliaWeb/URIParser.jl: Uniform Resource Identifier (URI) parser in Julia](https://github.com/JuliaWeb/URIParser.jl) have anything useful to you?

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [July 17, 2018, 7:54pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/4 "2018-07-17T19:54:48Z")

</div>

I don’t see in URIParser.jl a function to concatenate parts of an url.

---

<div class="post-metadata">

**Author:** ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)\
**Post date:** [July 17, 2018, 7:57pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/5 "2018-07-17T19:57:14Z")

</div>

Seems to me that this code from the README might be helpful, but this might not be everything you need:

> Additionally, there is a method for taking the parts of the URI individually, as well as a convenience method taking host and path which constructs a valid HTTP URL:

```julia
julia> URI("hdfs","hdfshost",9000,"/root/folder/file.csv","","","user:password")
URI(hdfs://user:password@hdfshost:9000/root/folder/file.csv)

julia> URI("google.com","/some/path")
URI(http://google.com:80/some/path)

```

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [July 17, 2018, 7:58pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/6 "2018-07-17T19:58:25Z")

</div>

oh yes… I was looking at a function in utils.jl  
Thank you

---

<div class="post-metadata">

**Author:** ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)\
**Post date:** [July 17, 2018, 8:02pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/7 "2018-07-17T20:02:02Z")

</div>

Glad I could help. My apologies - I did not notice that you had already checked the package. I could’ve saved you an iteration.

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [July 17, 2018, 8:03pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/8 "2018-07-17T20:03:49Z")

</div>

But that’s not perfect…  
How to do this if `"/root/folder/file.csv"` is in a `Vector` like `["root", "folder", "file.csv"]`

---

<div class="post-metadata">

**Author:** ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)\
**Post date:** [July 17, 2018, 8:13pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/9 "2018-07-17T20:13:21Z")

</div>

The URI takes a standard path, so `joinpath` should do what you need in \*nix: that is, you can pass in the output of `joinpath`:

```julia
a = ["/","foo", "bar", "baz"]
URI("zzz.com", joinpath(a...))

```

This might not work on Windows, though, given that `joinpath` will likely use backslashes there.

There might be a more elegant way of doing this as well.

---

<div class="post-metadata">

**Author:** ![Nosferican](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nosferican/32/9275_2.png) [@Nosferican](https://discourse.julialang.org/u/Nosferican)\
**Post date:** [July 17, 2018, 10:00pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/10 "2018-07-17T22:00:46Z")

</div>

How about a long-hand?

```julia
reduce(*, ["root", "folder", "file.csv"] .* "/")[1:end - 1] ==
       "root/folder/file.csv"

```

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [July 18, 2018, 8:25am UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/11 "2018-07-18T08:25:17Z")

</div>

```
joinpath("http://www.domain.com", "foo", "bar", "baz")

```

works fine even on Windows, it returns

```
"http://www.domain.com/foo/bar/baz"

```

---

<div class="post-metadata">

**Author:** ![sirex](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sirex/32/5910_2.png) [@sirex](https://discourse.julialang.org/u/sirex)\
**Post date:** [November 5, 2018, 3:46pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/12 "2018-11-05T15:46:46Z")

</div>

URL joining is a bit more complicated, for example:

```julia
joinurl("https://example.com/", "http://foo.bar/") == "http://foo.bar/"
joinurl("https://example.com/a/b", "..") == "https://example.com/a"
joinurl("https://example.com/a/b", "c") == "https://example.com/a/b/c"
joinurl("https://example.com/a/b", "/c") == "https://example.com/c"
joinurl("https://example.com/a/b?x=1", "c") == "https://example.com/a/b/c"

```

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [November 5, 2018, 4:12pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/13 "2018-11-05T16:12:42Z")

</div>

For my use case `joinpath` is enough but you are right @sirex URL joining is more complicated. Unfortunately I haven’t find a Julia package which provides such a function.

With Python

```python
$ ipython
Python 3.6.6 | packaged by conda-forge | (default, Jul 26 2018, 09:55:02)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from urllib.parse import urljoin as joinurl

In [2]: joinurl("https://example.com/", "http://foo.bar/")
Out[2]: 'http://foo.bar/'

In [3]: joinurl("https://example.com/a/b", "..")
Out[3]: 'https://example.com/'

In [4]: joinurl("https://example.com/a/b", "c")
Out[4]: 'https://example.com/a/c'

In [5]: joinurl("https://example.com/a/b", "/c")
Out[5]: 'https://example.com/c'

In [6]: joinurl("https://example.com/a/b?x=1", "c")
Out[6]: 'https://example.com/a/c'

In [7]: joinurl("a/b/c", "d/e")
Out[7]: 'a/b/d/e'

```

---

<div class="post-metadata">

**Author:** ![FemtoTrader](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/femtotrader/32/309_2.png) [@FemtoTrader](https://discourse.julialang.org/u/FemtoTrader)\
**Post date:** [November 5, 2018, 4:45pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/14 "2018-11-05T16:45:29Z")

</div>

Issue opened at [joinurl · Issue #19 · JuliaWeb/Roadmap · GitHub](https://github.com/JuliaWeb/Roadmap/issues/19)

---

<div class="post-metadata">

**Author:** ![Mark\_Nahabedian](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mark_nahabedian/32/16562_2.png) [@Mark\_Nahabedian](https://discourse.julialang.org/u/Mark_Nahabedian)\
**Post date:** [November 30, 2021, 7:38pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/15 "2021-11-30T19:38:39Z")

</div>

> [@FemtoTrader](#):
>
> ```julia
> joinpath("http://www.domain.com", "foo", "bar", "baz")
> 
> ```

Not any more:

```julia
joinpath("http://www.domain.com", "foo", "bar", "baz")

"http://www.domain.com\\foo\\bar\\baz"

```

In julia version 1.6.0.

---

<div class="post-metadata">

**Author:** ![StefanKarpinski](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stefankarpinski/32/24_2.png) [@StefanKarpinski](https://discourse.julialang.org/u/StefanKarpinski)\
**Post date:** [November 30, 2021, 8:11pm UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/16 "2021-11-30T20:11:23Z")

</div>

This was never a good way to join parts of a URL and it just happened to work on UNIX systems where the path separator is `/`. It would always have produced what you’re seeing on Windows and if it did something else, that’s pretty much an accident. Maybe some UNC drive stuff? Who knows. Don’t use `joinpath` for this. The entire reason for `joinpath` to exist is so that it can use platform-specific path separators and handle absolute and relative paths. Neither of those is an issue for URLs. Just join the parts with literal slashes between.

---

<div class="post-metadata">

**Author:** ![jzr](https://avatars.discourse-cdn.com/v4/letter/j/eb9ed0/32.png) [@jzr](https://discourse.julialang.org/u/jzr)\
**Post date:** [December 1, 2021, 1:19am UTC](https://discourse.julialang.org/t/join-parts-of-a-url-joinpath/12441/17 "2021-12-01T01:19:29Z")

</div>

See [`URIs.resolvereference`](https://docs.juliahub.com/URIs/eec2u/1.3.0/#URIs.resolvereference)

```julia
julia> u = resolvereference("http://example.org/foo/bar/", "/baz/")
URI("http://example.org/baz/")

```
