Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字典编码为HTTP GET查询字符串?_Http_Query String - Fatal编程技术网

如何将字典编码为HTTP GET查询字符串?

如何将字典编码为HTTP GET查询字符串?,http,query-string,Http,Query String,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的元素,只需将其从

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
值中弹出,然后再次对查询字符串进行URL编码。但是,如果您有更多的模态属性(具有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,3],'fred':4} 将是:

?foo[]=1&bar[]=2&bar[]=3&fred=4 ?foo[]=1和bar[]=2和bar[]=3和fred=4 数组答案应该不同于普通答案的原因是,解码层可以自动区分不太常见的foo情况(恰好只有一个元素的数组)和非常常见的fred情况(单个元素)

此符号可外推至:

?highlight_mode[7]=blue&highlight_mode[9]=yellow ?高亮显示模式[7]=蓝色,高亮显示模式[9]=黄色 当你有一个散列,而不仅仅是一个数组

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

空数组、空散列和缺少标量值在这种编码中看起来是相同的,但您对此无能为力


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

这段代码适用于我的Python后端-

import json, base64

请详细说明“相当多”。好吧,如果我有更多的细节,我会提到它们。我不知道这在哪里得到支持,但我记得在很多地方都看到过taw在上面提到了rubyonrails。许多其他框架可能会复制它,我已经在PHP中使用过它。
param={
        "key1":"val1",
        "key2":[
                {"lk1":"https://www.foore.in", "lk2":"https://www.foore.in/?q=1"},
                {"lk1":"https://www.foore.in", "lk2":"https://www.foore.in/?q=1"}
                ]
        }
encoded_param=base64.urlsafe_b64encode(json.dumps(param).encode())
encoded_param_ready=str(encoded_param)[2:-1]

#eyJrZXkxIjogInZhbDEiLCAia2V5MiI6IFt7ImxrMSI6ICJodHRwczovL3d3dy5mb29yZS5pbiIsICJsazIiOiAiaHR0cHM6Ly93d3cuZm9vcmUuaW4vP3E9MSJ9LCB7ImxrMSI6ICJodHRwczovL3d3dy5mb29yZS5pbiIsICJsazIiOiAiaHR0cHM6Ly93d3cuZm9vcmUuaW4vP3E9MSJ9XX0=
#In JS
var decoded_params = atob(decodeURI(encoded_param_ready));