neturl

Lua 的 URL 和查询字符串解析器、构建器、规范化器

$ opm get bsiara/neturl

一个强大的 Lua URL 解析器和构建器

这个小型 Lua 库提供了一些函数,可以轻松地解析带有查询字符串的 URL 并构建新的 URL。

    url = require "net.url"

URL 解析器

该库将 URL 转换为 RFC 中描述的元素表:方案、主机、路径等。

    u = url.parse("http://www.example.com/test/?start=10")
    print(u.scheme)
    -- http
    print(u.host)
    -- www.example.com
    print(u.path)
    -- /test/

URL 规范化

    u = url.parse("http://www.FOO.com:80///foo/../foo/./bar"):normalize()
    print(u)
    -- http://www.foo.com/foo/bar

URL 解析器

URL 解析遵循 RFC 2396 中提供的示例。

    u = url.parse("http://a/b/c/d;p?q"):resolve("../../g")
    print(u)
    -- http://a/g

路径构建器

可以使用 __div 元表或 u.addSegment() 添加路径段。

    u = url.parse('http://example.com')
    u / 'bands' / 'AC/DC'
    print(u)
    -- http://example.com/bands/AC%2FDC

模块选项

  • separator 用于指定查询参数之间使用的分隔符。默认为 &

  • cumulative_parameters 默认为 false。如果为 true,则具有相同名称的查询参数将存储在表中。

  • legal_in_path 是一个字符表,这些字符在路径组件中不会被 URL 编码。

  • legal_in_query 是一个字符表,这些字符在查询值中不会被 URL 编码。另一方面,查询参数仅支持一小部分合法字符 (-_.)。

  • query_plus_is_space 默认为 true,因此查询值中的加号将转换为 %20(空格),而不是 %2B(加号)。

如果希望在路径段中保留 + 符号,可以将其添加到路径中合法字符的列表中。例如

    url = require "net.url"
    url.options.legal_in_path["+"] = true;

查询字符串解析器

该库支持查询字符串中的括号,如 PHP。这意味着您可以使用括号构建多维表。解析后的查询字符串有一个 tostring() 辅助函数。与 Lua 一样,如果未指定索引,则从索引 1 开始。

    query = url.parseQuery("first=abc&a[]=123&a[]=false&b[]=str&c[]=3.5&a[]=last")
    print(query)
    -- a[1]=123&a[2]=false&a[3]=last&b[1]=str&c[1]=3.5&first=abc
    print(query.a[1])
    -- 123

查询字符串构建器

    u = url.parse("http://www.example.com")
    u.query.foo = "bar"
    print(u)
    -- http://www.example.com/?foo=bar
    
    u:setQuery{ json = true, skip = 100 }
    print(u)
    -- http://www.example.com/?json=true&skip=100

与 luasocket/url.lua 的区别

  • Luasocket/url.lua 无法正确解析 http://www.example.com?url=net,因为没有路径。

  • Luasocket/url.lua 无法清理和规范化 URL,例如删除默认端口、端口中的额外零、空授权、大写方案、域名。

  • Luasocket/url.lua 不会解析查询字符串参数。

  • Luasocket/url.lua 与 RFC 2396 的兼容性较差,并且会将 http://a/b/c/d;p?q 和:../../../g 解析为 http://ag 而不是 http://a/g ../../../../g 解析为 http://a../g 而不是 http://a/g g;x=1/../y 解析为 http://a/b/c/g;x=1/../y 而不是 http://a/b/c/y /./g 解析为 http://a/./g 而不是 http://a/g g;x=1/./y 解析为 http://a/b/c/g;x=1/./y 而不是 http://a/b/c/g;x=1/y

作者

Bertrand Mansion (golgote)

许可证

mit

版本

  • Lua 的 URL 和查询字符串解析器、构建器、规范化器 2023-01-23 15:41:45