我应该如何将字典编码到HTTP GET查询字符串中?

HTTP GET查询字符串是键/值对的有序序列:

?spam=eggs&spam=ham&foo=bar

具有某些语义,是相当于下面的字典:

{'spam': ['eggs', 'ham'], 'foo': bar}

这种情况对于请求的那个页面的布尔属性来说效果很好:

?expand=1&expand=2&highlight=7&highlight=9
{'expand': [1, 2], 'highlight': [7, 9]}

如果您想停止使用id 2扩展元素,只需将其从expand值中弹出并再次对查询字符串进行urlencode即可。 然而,如果你有更多的模态属性(有3个以上的选择),你真的想要像这样代表一个结构:

{'highlight_mode': {7: 'blue', 9: 'yellow'}}

其中相应的id键的值是已知枚举的一部分。 将此编码到查询字符串中的最佳方法是什么? 我正在考虑使用如下这样的二元组序列:

?highlight_mode=(7,blue)&highlight_mode=(9,yellow)

编辑:也很高兴知道任何与公约相关的名称。 我知道可能没有,但能够使用名称而不是示例来讨论具体的事情是很好的。 谢谢!


通常的做法是这样做:

highlight_mode[7]=blue&highlight_mode[9]=yellow

AFAIR,相当多的服务器端语言实际上支持这种开箱即用的方式,并且会为这些值生成一个很好的字典。


我还见过JSON编码嵌套字典的人,然后用BASE64(或类似的东西)进一步编码它,然后将整个结果作为单个查询字符串参数传递。

很难看。

另一方面,如果您可以使用POST,JSON是一种非常好的方式来回传递这种信息。


在许多Web框架中,它的编码与您所说的不同。

{'foo': [1], 'bar': [2, 3], 'fred': 4}

将会:

?foo[]=1&bar[]=2&bar[]=3&fred=4

数组答案应该与普通答案不同的原因是,解码层可以从极为常见的fred案例(单个元素)中自动分辨不常见的foo案例(恰好只有一个元素的数组)。

这个符号可以推断为:

?highlight_mode[7]=blue&highlight_mode[9]=yellow

当你有一个散列时,不仅仅是一个数组。

我认为这几乎是从Rails复制的Rails和大多数框架所做的。

在这种编码中,空数组,空散列和缺少标量值看起来完全相同,但您可以做的事情不多。

这[]似乎只引起了一些火焰之战。 有些人认为这是不必要的,因为浏览器,传输层和查询字符串编码器不在意。 唯一关心的是自动查询字符串解码器。 我支持Rails使用[]的方式。 另一种方法是使用单独的方法来提取标量并从查询字符串中提取数组,因为没有自动的方法来告诉程序何时需要4 [4]。

链接地址: http://www.djcxy.com/p/17577.html

上一篇: How should I encode dictionaries into HTTP GET query strings?

下一篇: Post the checkboxes that are unchecked