2

我正在构建一个 HTML5 单页应用程序,我希望允许用户保留当前应用程序状态以供以后使用。我想通过使用特制查询部分创建指向我的页面的链接 URL 来实现这一点。当再次使用 URL 调用时,应用程序将解析查询部分并重新创建存储的状态。

现在,状态的某些部分是一个列表,其项目是数值和相关的文本。浮点数值以及文本不需要是唯一的。

像这样:

4.54  first
12.1  another
12.1  more
34    more

我的意图是创建一个这样的 URL:

www.myappdomain.com/SinglePage.html?4.54=first&12.1=another&12.1=more&34=more

这是合法的网址吗?给定文本的正确编码,这会在野外工作吗?

我已阅读Alan Skorkin 的 What Every Developer Should Know About URLs,我通常可以推荐有关 URL 的内容以及有关 URL 字符使用的答案

对我来说,这样做似乎是合法的,但我仍然感到有点不舒服,因为我还没有找到关于我可能拥有的可能非唯一键以及关于一般查询部分中作为键的数字的信息。

编辑:我已经把它带到了工作中,见下文(如果链接中断,请告诉我): http://quir.li/player.html?media=http%3A%2F%2Fwww.youtube.com%2Fwatch% 3Fv %3D0VqTwnAuHws&title=What%20makes%20you%20beautiful&artist=%20piano%20guys%20covering%20One%20Republic&album=Youtube&6.49=Intro&30.12=Knocking%20part&46.02=Real%20playing&51.5=Piano%20forte&93.32=Stringified& .35=人声&139.38=Key%20cover%20jam&150.16=Good%20morning%20sky&173.96=Final%20chord

4

3 回答 3

2

这是 URI 规范的合法 URL - https://www.rfc-editor.org/rfc/rfc3986。然而,这是否会在野外工作是一个不同的问题,因为规范只定义了 URI 的通用语法。

由于没有关于查询部分中的重复键应该做什么的规范(请参阅重复 HTTP GET 查询键的权威位置)不同的软件框架会以不同的方式处理这些 URI。但是,大多数框架会正确地将重复键检测为具有相同键的多个值,并将这些值分组到给定键的单个数组/值列表中(而不是使用给定键的最后一个值并丢弃所有先前的值)那把钥匙)。使用数字作为键也可以,因为键被解析为文本字符串。简而言之:你应该是安全的。

于 2012-09-17T19:19:28.087 回答
0

我不认为这是传递数据的好方法,查询字符串参数通常被视为可以通过其名称访问的参数,这里您实际上将一些数据作为参数传递,而从技术角度来看,这可以做到代码有些混淆,我会使用 JSON 编码在单个参数中传递这些数据

于 2012-09-17T19:11:32.433 回答
0

这篇文章表明没有规范说非唯一键是无效的。

重复 HTTP GET 查询键的权威位置

我似乎找不到任何关于数字键的具体内容。

However, this might be a workaround if you don't want to use non-unique numeric keys for any reason: Use some basic encoding to map numbers to strings. Something basic could be 1-a, 2-b, 3-c, 4-d...9-i, 0-j. And '.' could be 'k' (if there is not spec about whether '.' is a legal character in a URL parameter) Then, e.g., 21.3 would encode to bakc. Also you can add a number in the end of the encoded key to ensure that keys are unique. These numbers would be ignored while decoding (or could help differentiate between the parameters). Then the first 21.3 would encode to bakc1, the next bakc2 etc)

于 2012-09-17T19:46:42.400 回答