用于在Elixir中构造带有查询字符串的URI的习惯用法

Ada*_*hip 4 uri elixir query-string

我想知道最常用的方法是URI将查询字符串添加到Elixir中的基本URI.

我现在正在做这样的事情:

iex(1)> base = "http://example.com/endpoint"
"http://example.com/endpoint"

iex(2)> query_string = URI.encode_query(foo: "bar")
"foo=bar"

iex(3)> uri_string = URI.parse(base) |> Map.put(:query, query_string) |> URI.to_string
"http://example.com/endpoint?foo=bar"
Run Code Online (Sandbox Code Playgroud)

但是想知道是否有更简洁的方法来设置查询字符串.我知道URI.merge/2,但我不认为查询字符串是一个有效的URI,因此这里可能不合适(?不会添加).

我也可以这样做:

uri_string = %URI{ URI.parse(base) | query: query_string } |> URI.to_string
Run Code Online (Sandbox Code Playgroud)

但我想知道我错过了一种更简单或更清晰的方法.

zwi*_*pie 7

我认为你的第一个例子,有一些格式,读得很好:

uri_string =
  base_url
  |> URI.parse()
  |> Map.put(:query, URI.encode_query(params))
  |> URI.to_string()
Run Code Online (Sandbox Code Playgroud)

我不知道其他成语/捷径.


Ada*_*hip 6

Elixir 1.13 引入了URI.new!/1,与此不同的是,URI.parse/1它还验证 URI。Elixir 1.14 的引入URI.append_query/2是为了方便地更新查询字符串。对于 Elixir 1.14 及更高版本,我认为最惯用的方法是:

"http://example.com/endpoint"
|> URI.new!()
|> URI.append_query(URI.encode_query(foo: "bar"))
|> URI.to_string()
Run Code Online (Sandbox Code Playgroud)

输出:

"http://example.com/endpoint?foo=bar"
Run Code Online (Sandbox Code Playgroud)