遇到一个前端与 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 的话,你这边截断处理再拼回去吧 |