Как мне кодировать словари в строки запроса 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]}

Если вы хотите прекратить расширение элемента с идентификатором 2, просто вытяните его из значения expand и снова введите urlencode в строку запроса. Однако, если у вас есть более модальное свойство (с 3+ вариантами выбора), вы действительно хотите представить такую ​​структуру:

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

Где значения соответствующих ключей id являются частью известного перечисления. Как лучше всего закодировать это в строку запроса? Я думаю об использовании последовательности из двух кортежей, например:

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

Редактировать: Также было бы неплохо знать любой имена, который связан с соглашениями. Я знаю, что их может и не быть, но приятно иметь возможность говорить о чем-то конкретном, используя имя вместо примеров. Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
4 789
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Обычный способ сделать это так:

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

AFAIR, довольно много серверных языков фактически поддерживают это из коробки и создают хороший словарь для этих значений.

Уточните, пожалуйста, «довольно много».

Crescent Fresh 11.01.2009 03:21

Что ж, если бы у меня были подробности, я бы их упомянул. Я не знаю, где это поддерживается, но я помню, что видел это во многих местах. 'taw' упомянул Ruby on Rails выше. Многие другие фреймворки, вероятно, скопируют это, и я уже использовал это в PHP.

Konrad Rudolph 11.01.2009 18:22

Я также видел, как люди 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));

Другие вопросы по теме