Pregunta

Una cadena de consulta HTTP GET es una secuencia ordenada de pares clave / valor:

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

Es, con cierta semántica, equivalente al siguiente diccionario:

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

Esto funciona bien para las propiedades booleanas de esa página que se solicita:

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

Si desea dejar de expandir el elemento con la identificación 2, simplemente sáquelo del valor expandir y codifique nuevamente la cadena de consulta. Sin embargo, si tiene una propiedad más modal (con más de 3 opciones), realmente desea representar una estructura como esta:

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

Donde los valores de las claves de identificación correspondientes son parte de una enumeración conocida. ¿Cuál es la mejor manera de codificar esto en una cadena de consulta? Estoy pensando en usar una secuencia de dos tuplas así:

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

Editar: También sería bueno saber cualquier nombre que se asocie con las convenciones. Sé que puede que no haya ninguno, pero es bueno poder hablar sobre algo específico usando un nombre en lugar de ejemplos. Gracias!

¿Fue útil?

Solución

La forma habitual es hacerlo así:

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

AFAIR, bastantes idiomas del lado del servidor realmente admiten esto de inmediato y producirán un buen diccionario para estos valores.

Otros consejos

También he visto a personas codificar en JSON el diccionario anidado, luego codificarlo más con BASE64 (o algo similar), y luego pasar todo el desorden resultante como un único parámetro de cadena de consulta.

Bastante feo.

Por otro lado, si puede salirse con la suya utilizando POST, JSON es una muy buena manera de pasar este tipo de información de un lado a otro.

En muchos marcos web está codificado de manera diferente a lo que usted dice.

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

sería:

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

La razón por la que las respuestas de la matriz deberían ser diferentes de las respuestas simples es que la capa de decodificación puede distinguir automáticamente el caso foo menos común (matriz que simplemente tiene un solo elemento) del caso fred extremadamente común (elemento único).

Esta notación se puede extrapolar a:

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

cuando tienes un hash, no solo una matriz.

Creo que esto es más o menos lo que hacen Rails y la mayoría de los frameworks que copian de Rails.

Las matrices vacías, los hashes vacíos y la falta de valor escalar se ven idénticos en esta codificación, pero no hay mucho que pueda hacer al respecto.

Esto [] parece estar causando solo unas pocas llamas. Algunos lo ven como innecesario, porque al navegador, la capa de transporte y el codificador de cadena de consulta no les importa. Lo único que le importa es el decodificador automático de cadenas de consulta. Apoyo la forma de usar Rails []. La alternativa sería tener métodos separados para extraer un escalar y extraer una matriz de la cadena de consulta, ya que no hay una forma automática de saber cuándo el programa quiere [1] cuando quiere 4.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top