URI
URI
用于使用URI的实用程序。
此模块提供了使用URI的功能(例如,解析URI或编码查询字符串)。本模块中的功能根据RFC 3986实施。
摘要
类型
t()
功能
char_reserved?(char)
检查该字符是否为URI中的“保留”字符。
char_unescaped?(char)
检查是否允许在URI中不转义字符。
char_unreserved?(char)
检查该字符是否为URI中的“无保留”字符。
decode(uri)
百分比-释放URI
decode_query(query, map \ %{})
将查询字符串解码为映射
decode_www_form(string)
将字符串解码为“x-www-form-urlencode”。
default_port(scheme)
返回给定方案的默认端口。
default_port(scheme, port)
注册默认port
对于给定的scheme
encode(string, predicate \ &char_unescaped?/1)
百分比-转义所有需要在字符串中转义的字符。
encode_query(enumerable)
将可枚举编码为查询字符串。
encode_www_form(string)
将字符串编码为“x-www-form-urlencode”。
merge(uri, rel)
合并两个URI
parse(uri)
将格式良好的URI引用解析到其组件中。
query_decoder(query)
返回query
给定中表示键值对的两元素元组流
to_string(uri)
返回给定值的字符串表示形式。URI
结构
类型
t()
t() :: %URI{authority: nil | binary, fragment: nil | binary, host: nil | binary, path: nil | binary, port: nil | :inet.port_number, query: nil | binary, scheme: nil | binary, userinfo: nil | binary}
功能
char_reserved?(char)
char_reserved?(char) :: boolean
检查该字符是否为URI中的“保留”字符。
保留字符在RFC 3986,第2.2条...
实例
iex> URI.char_reserved?(?+)
true
char_unescaped?(char)
char_unescaped?(char) :: boolean
检查是否允许在URI中不转义字符。
这是默认的URI.encode/2
保留字符和非保留字符都保持不转义的情况。
实例
iex> URI.char_unescaped?(?{)
false
char_unreserved?(char)
char_unreserved?(char) :: boolean
检查该字符是否为URI中的“无保留”字符。
中指定的非保留字符。RFC 3986,第2.3条...
实例
iex> URI.char_unreserved?(?_)
true
decode(uri)
decode(binary) :: binary
百分比-释放URI。
实例
iex> URI.decode("http%3A%2F%2Felixir-lang.org")
"http://elixir-lang.org"
decode_query(query, map \ %{})
decode_query(binary, map) :: map
将查询字符串解码为映射。
的形式的查询字符串。key1=value1&key2=value2...
,此函数将查询字符串中的每个键值对作为给定的map
.结果映射中的键和值将是二进制文件。键和值将是%-未转义。
使用query_decoder/1
如果您想手动迭代每个值。
实例
iex> URI.decode_query("foo=1&bar=2")
%{"bar" => "2", "foo" => "1"}
iex> URI.decode_query("percent=oh+yes%21", %{"starting" => "map"})
%{"percent" => "oh yes!", "starting" => "map"}
decode_www_form(string)
decode_www_form(binary) :: binary
将字符串解码为“x-www-form-urlencode”。
实例
iex> URI.decode_www_form("%3Call+in%2F")
"<all in/"
default_port(scheme)
default_port(binary) :: nil | non_neg_integer
返回给定方案的默认端口。
如果该方案不为URI
模块,此函数将返回nil
.任何方案的默认端口都可以通过default_port/2
...
实例
iex> URI.default_port("ftp")
21
iex> URI.default_port("ponzi")
nil
default_port(scheme, port)
default_port(binary, non_neg_integer) :: :ok
注册默认port
对于给定的scheme
...
在调用此函数之后,port
将由default_port/1
对于给定的方案scheme
。请注意,此函数将更改给定端口的默认端口。scheme
全球
,对每个应用程序都有意义。
建议在应用程序的start回调中调用此函数,以防您要注册新URI。
encode(string, predicate \ &char_unescaped?/1)
encode(binary, (byte -> boolean)) :: binary
百分比-转义所有需要在字符串中转义的字符。
这意味着保留字符,例如:
和/
和所谓的无保留字符,具有相同的含义都是转义和未转义,将不会在默认情况下转义。
见encode_www_form
如果您也对转义保留字符感兴趣。
此函数还接受predicate
函数作为可选参数。如果被传递,这个函数将被调用,每个字节在string
作为它的论据,应该回来true
如果给定的字节应该保持原样。
实例
iex> URI.encode("ftp://s-ite.tld/?value=put it+й")
"ftp://s-ite.tld/?value=put%20it+%D0%B9"
iex> URI.encode("a string", &(&1 != ?i))
"a str%69ng"
encode_query(enumerable)
encode_query(term) :: binary
将可枚举的枚举编码为查询字符串。
获取一个列举为两元组元组(例如,一个映射或一个关键字列表)的枚举,并返回一个字符串,其形式为key1=value1&key2=value2...
key和values按照URL编码的形式encode_www_form/1
。
键和值可以是实现String.Chars
协议,但明确禁止的列表除外。
实例
iex> hd = %{"foo" => 1, "bar" => 2}
iex> URI.encode_query(hd)
"bar=2&foo=1"
iex> query = %{"key" => "value with spaces"}
iex> URI.encode_query(query)
"key=value+with+spaces"
iex> URI.encode_query %{key: [:a, :list]}
** (ArgumentError) encode_query/1 values cannot be lists, got: [:a, :list]
encode_www_form(string)
encode_www_form(binary) :: binary
将字符串编码为“x-www-form-urlencode”。
例
iex> URI.encode_www_form("put: it+й")
"put%3A+it%2B%D0%B9"
merge(uri, rel)
merge(t | binary, t | binary) :: t
合并两个城市。
此函数合并两个URI,如下所示RFC 3986,第5.2条...
实例
iex> URI.merge(URI.parse("http://google.com"), "/query") |> to_string
"http://google.com/query"
iex> URI.merge("http://example.com", "http://google.com") |> to_string
"http://google.com"
parse(uri)
parse(t | binary) :: t
将格式良好的URI引用解析到其组件中。
注意,这个函数需要一个格式良好的URI,不执行任何验证。请参阅下面的“示例”一节,以了解如何URI.parse/1
可用于解析广泛的URI。
中定义的解析正则表达式。RFC 3986,附录B...
当一个URI没有端口时,URI.default_port/1
对于URI的方案,则用于:port
场。
如果%URI{}
结构被赋予这个函数,这个函数不加修改地返回它。
实例
iex> URI.parse("http://elixir-lang.org/")
%URI{scheme: "http", path: "/", query: nil, fragment: nil,
authority: "elixir-lang.org", userinfo: nil,
host: "elixir-lang.org", port: 80}
iex> URI.parse("//elixir-lang.org/")
%URI{authority: "elixir-lang.org", fragment: nil, host: "elixir-lang.org",
path: "/", port: nil, query: nil, scheme: nil, userinfo: nil}
iex> URI.parse("/foo/bar")
%URI{authority: nil, fragment: nil, host: nil, path: "/foo/bar",
port: nil, query: nil, scheme: nil, userinfo: nil}
iex> URI.parse("foo/bar")
%URI{authority: nil, fragment: nil, host: nil, path: "foo/bar",
port: nil, query: nil, scheme: nil, userinfo: nil}
query_decoder(query)
query_decoder(binary) :: Enumerable.t
返回query
表示给定值对的双元素元组的流。
每个元组中的键和值都将是二进制文件,并且将以百分比形式转义。
实例
iex> URI.query_decoder("foo=1&bar=2") |> Enum.to_list()
[{"foo", "1"}, {"bar", "2"}]
to_string(uri)
to_string(t) :: binary
返回给定值的字符串表示形式。URI
结构。
iex> URI.to_string(URI.parse("http://google.com"))
"http://google.com"
iex> URI.to_string(%URI{scheme: "foo", host: "bar.baz"})
"foo://bar.baz"