【发布时间】:2018-03-19 16:28:18
【问题描述】:
在我的基于反应的单页应用程序中,我的页面分为两个窗格。
左窗格:过滤器面板。
右窗格:网格(包含通过应用过滤器的数据的表格)
总之,我有一个看起来与 amazon.com 非常相似的应用程序。默认情况下,当用户在浏览器中点击应用程序的根端点 (/) 时,我会从服务器获取最近 7 天的数据并将其显示在网格中。
过滤器面板有几个过滤器(例如,时间过滤器用于获取指定时间间隔内的数据,ID 用于搜索具有特定 ID 的数据等)和一个附加在过滤器面板标题中的搜索按钮。点击搜索按钮通过在帖子表单正文中提供选定的过滤器来对服务器进行发布调用,服务器返回与传递的过滤器匹配的数据,我的前端应用程序在网格内显示从服务器返回的这些数据。
现在,当有人点击过滤器面板中的搜索按钮时,我想在 URL 的查询参数中反映选定的过滤器,因为这将有助于我与我网站的其他用户共享这些 URL,以便他们可以看到过滤器我应用并查看了网格内仅匹配这些过滤器的数据。
这里的问题是,如果在搜索按钮单击时,我使用带有查询参数的 http get,由于不同浏览器对 URL 长度的限制,我最终会破坏应用程序。
请建议我创建此类 URL 的正确解决方案,这将帮助我在过滤器面板中设置选定的过滤器,而不会对我的应用程序造成任何副作用。
可能的解决方案: 考虑到由于不同浏览器的 URL 长度限制,我们不能直接在查询参数中添加纯字符串(注:规范不限制 HTTP Get 请求的长度,但不同浏览器实现自己的限制),我们可以使用消息摘要或哈希(将任意长度的输入转换为固定长度的输出)并将其保存在数据库中以供服务器理解请求并返回内容。这只是一个想法,我不确定这是否是这个问题的理想解决方案。
其他频繁使用的网站的行为:
- amazon.com、newegg.com -> 使用散列网址。
- kayak.com -> 因为他们有非常明确的关键字,他们使用 短格式,例如 IN 代表印度,BLR 代表班加罗尔等,并结合 这与否定逻辑进一步优化最大 url 长度。不是 已检查,但理想情况下,这会在选择大量过滤器后中断。
- flipkart.com -> 将字符串直接附加到查询参数和中断 突破限制后。验证了这一点。
【问题讨论】:
-
你真的遇到过这个问题吗?我相信现代浏览器中的 URL 长度几乎是无限的。
-
因此,超过 2000 个字符的 URL 的问题似乎只影响 IE
-
您的意思是说创建任何长度的临时 URL 都不成问题?我看到亚马逊创建哈希并将这些哈希附加到 URL 中,而不是以纯文本格式附加选定的过滤器。
-
如果您遇到的问题是由于查询字符串太长而导致对服务器的请求引发错误,您应该使用请求正文而不是查询参数发送数据。
标签: javascript reactjs url redux react-router