Строка запроса 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]}
Если вы хотите прекратить расширение элемента с идентификатором 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, довольно много серверных языков фактически поддерживают это из коробки и создают хороший словарь для этих значений.
Что ж, если бы у меня были подробности, я бы их упомянул. Я не знаю, где это поддерживается, но я помню, что видел это во многих местах. 'taw' упомянул Ruby on Rails выше. Многие другие фреймворки, вероятно, скопируют это, и я уже использовал это в PHP.
Я также видел, как люди JSON кодируют вложенный словарь, затем кодируют его с помощью BASE64 (или чего-то подобного), а затем передают весь полученный беспорядок как один параметр строки запроса.
Довольно уродливые.
С другой стороны, если вы можете обойтись без использования POST, JSON - действительно хороший способ передавать такую информацию туда и обратно.
Во многих веб-фреймворках это кодируется иначе, чем вы говорите.
{'foo': [1], 'bar': [2, 3], 'fred': 4}было бы:
?foo[]=1&bar[]=2&bar[]=3&fred=4
Причина, по которой ответы массива должны отличаться от простых ответов, заключается в том, что уровень декодирования может автоматически отличать менее распространенный случай foo (массив, который просто имеет один элемент) от чрезвычайно распространенного случая fred (один элемент).
Это обозначение можно экстраполировать на:
?highlight_mode[7]=blue&highlight_mode[9]=yellow
когда у вас есть хеш, а не просто массив.
Я думаю, что это в значительной степени то, что делают Rails и большинство фреймворков, копируемых из Rails.
Пустые массивы, пустые хэши и отсутствие скалярного значения выглядят одинаково в этой кодировке, но с этим мало что можно поделать.
Это [], похоже, вызывает лишь несколько огневых войн. Некоторые считают это ненужным, потому что браузеру, транспортному уровню и кодировщику строки запроса все равно. Единственное, что волнует, - это автоматический декодер строки запроса. Я поддерживаю способ использования [] в Rails. Альтернативой может быть использование отдельных методов для извлечения скаляра и извлечения массива из строки запроса, поскольку нет автоматического способа определить, когда программа хочет [1], когда она хочет 4.
Этот фрагмент кода у меня работает с Python Backend-
import json, base64
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));
Уточните, пожалуйста, «довольно много».