
遇到一个前端与 Native 上的问题。前端使用 hash 的路由方式,导致 iOS 端去获取参数失败。由于历史原因,部分传参数是通过 url 传递的。
let url = URL(string: "https://www.abc.com?id=123") let url2 = URL(string: "https://www.abc.com/#/home?id=123") url?.query //id=123 url2?.query //nil /// foo://example.com:8042/over/there?name=ferret#nose /// \_/ \______________/\_________/ \_________/ \__/ /// | | | | | /// scheme authority path query fragment 稍微看了 URL 的文档,这个没有取到 query 应该是链接不符合 RPC3896 协议导致取 query 失败。如果讲 #/home 路由放到链接的最后面,是可以成功的。有个疑问是像 url2 这种形式的链接只能另写一套解析 query 和路由的方法吗?
1 Lax 2019-08-02 10:51:16 +08:00 与 RFC 冲突基本无解,要不然就自己维护一套奇怪的规则。 最好是在遵循 RFC 的前提下去构造 URL,而不是在解析时搞黑科技。 |
2 dorentus 2019-08-02 10:52:34 +08:00 确实如你所说,query 取不到因为 url2 根本就没有 query,只有一个 fragment: "/home?id=123" 对前端也是如此,比如在浏览器或者 node.js 里面: let url = new URL("https://www.abc.com/#/home?id=123") url.search // => "" url.hash // => "#/home?id=123" 前端框架也应该是自己去解析的 |
3 hauibojek 2019-08-02 10:52:56 +08:00 ``` let characters = "#" var allowedSet = CharacterSet.urlQueryAllowed allowedSet.remove(charactersIn: characters) var str = "https://www.abc.com/#/home?id=123" str = str.addingPercentEncoding(withAllowedCharacters: allowedSet) ?? str let url = URL(string: str) print(url?.query) // Optional("id=123") ``` |
4 acumen OP |
5 acumen OP @hauibojek 感谢,这样是可以取到 query 的,但是路由又取不到了。比如我想在 url 上更新 id 的值,需要获取 url 的路由和 query 之后手动更新,再拼接 |
6 Lax 2019-08-02 11:05:54 +08:00 先去完整 URL 的 .fragment 得到 ‘/home?id=123 ’,再用后者构造另一个 URL 取 .query。两行代码 |
7 acumen OP @Lax emmm,这样是可以取到 query,路由 route 我用后者的 path ?,还需要再次拼接好 url。可以是可以,但是感觉比较 tricky |
8 xi_lin 2019-08-02 14:16:33 +08:00 前端为了单页面模式下不刷新,只能用 hash mode 了。其实现在也可以用 history api 一定是 hash mode 的话,你这边截断处理再拼回去吧 |