我所面对的是:
我正在构建一个涉及多个搜索参数的搜索应用程序,我希望能够为该URL添加书签以供以后使用。
我想解决方案会如下所示:
为了给出一点意见,下面的两个请求应该是相同的:
Original request:
POST /search (with POSTed parameters key1=asd and key2=10)
Subsequent/bookmarkable request:
GET /search?params=ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890
params
应该是可逆的(并且可能已经过验证,但并不重要)原始参数。
我的问题是:将参数编译成一个参数的最佳方案是什么?
到目前为止我的想法:
我正在考虑使用键值字典,逗号分隔,Base64编码;但我不确定编码字符串会持续多长时间(同时请记住URL长度限制)。我可能正在寻找的可能是可逆压缩。任何对这种方法的疑虑都是值得欢迎的。
答案 0 :(得分:0)
除了评论中提到的POST / GET之外,我在PHP中做的是:
a)将原始(验证的)参数存储在会话中并传递它们的散列(参数的字符串的md5)或其他。这用于搜索结果类型的东西。显然,我的例子是主要的,但会给你一个想法。我们存储导致结果的参数:
要求A)
search.php?a=b&c=d&e=f...
md5()
在搜索的查询字符串上生成的哈希:
$_SESSION['old_searches'][md5($_SERVER['QUERY_STRING'])] = $_GET;
请求B)
search.php?in=[hash of a=b&c=d used to lookup that query string]
可能很基本,但我认为这是你追求的事情类型?在PHP中我们做:
$old_params = $_SESSION['old_searches'][$_GET['in']];
你的哈希可以是任何东西,整数,日期时间戳,Unix纪元时间......
如果你想让使其成为可收藏的,那么只需要一个方法将序列化的HTTP查询字符串或POST输入与 UID 而不是哈希一起存储到数据库中。在这种情况下,只有当存储的值始终对应于散列/不可变而不改变散列时,散列才可以。我可以使用:
$database_key = generate_small_uid();
$database_value = json_encode($_POST);
printf('<a href="/search_bookmark/%s">Your search bookmark</a>', $database_key);
只是不要使用MD5作为主键或类似的东西。在这种情况下,您只需要一个小的唯一标识符。
显然处理更安全。我确信更熟悉C#的人会知道PHP中的等价物(基本上它只是与状态相关的哈希值)。
答案 1 :(得分:0)
我认为您需要使用GET使整个机制无状态(因此所有必需的信息都在url中编码),或者将状态保存在某个数据库中的服务器上,然后使用该状态的密钥。
我强烈建议您使用GET方法,即使您有许多参数 - 这是唯一强大且可扩展的方式(例如,查看任何Google服务)。为了使你的网址更具可读性,你可以考虑将一些参数作为路径的一部分而不是参数,即。
http://www.mysite.com/param1_value/param2_value/param3_value/search.aspx?param4=param4_value&....
我认为这比尝试散列/压缩这些真实参数值更好,因为像Firefox或Chrome这样的浏览器可以让用户在输入地址栏时搜索这些字符串。