2010-04-10 13 views
7

Estoy trabajando en una API que acepta datos de clientes remotos, algunos de los cuales la clave en un HTTP POST casi funciona como una matriz. En inglés, lo que esto significa es decir que tengo un recurso en mi servidor llamado "clase". Una clase en este sentido, es el tipo en el que se sienta un alumno y educa al profesor. Cuando el usuario envía un HTTP POST para crear una nueva clase para su aplicación, muchos de los pares de valores clave son:Múltiples pares clave/valor en HTTP POST donde la clave es del mismo nombre

student_name : Bob Smith
student_name: Jane Smith
student_name: Chris Smith

Cuál es la mejor manera de manejar esto tanto en el lado del cliente (digamos que el cliente está curvado y ActiveResource, cualquiera que sea ..) y lo que es una manera decente de manejar esto en el lado del servidor si mi servidor es una aplicación de Ruby on Rails? Se necesita una forma de permitir varias claves con el mismo nombre y sin ningún tipo de conflicto de nombres o pérdida de datos.

Mi requisito tiene que ser que los datos POST sean pares llave/valor urlencoded.

Respuesta

20

Hay dos maneras de manejar esto, y dependerá de la arquitectura del lado del cliente cómo lo haga, ya que los estándares HTTP no reducen la situación.

Tradicionalmente, las solicitudes HTTP simplemente usaban la misma clave para valores repetidos, y lo dejaban en la arquitectura del cliente para darse cuenta de lo que estaba sucediendo. Por ejemplo, usted podría tener una petición POST con los siguientes valores:

student_name=Bob+Smith&student_name=Jane+Smith&student_name=Chris+Smith 

Cuando la arquitectura de recepción tiene esa cadena, se tendría que darse cuenta de que había varias claves de student_name y actuar en consecuencia. Por lo general, se implementa de modo que si tiene una sola clave, se crea un valor escalar, y si tiene múltiples de la misma clave, los valores se ponen en una matriz.

Las arquitecturas modernas del lado del cliente, como PHP y Rails, utilizan sin embargo una sintaxis diferente. Cualquier tecla que desea leerse como una matriz se anexan corchetes, como esto:

arquitectura
student_name[]=Bob+Smith&student_name[]=Jane+Smith&student_name[]=Chris+Smith 

La recepción creará una estructura de matriz denominada "student_name" sin los corchetes. La sintaxis del corchete soluciona el problema de no poder enviar una matriz con un solo valor, que no podría manejarse con el método "tradicional".

Dado que está utilizando Rails, la sintaxis del corchete cuadrado sería el camino a seguir. Si cree que podría cambiar las arquitecturas del lado del servidor o desea distribuir su código, podría buscar métodos más independientes, como la codificación JSON de la cadena que se envía, que agrega sobrecarga, pero podría ser útil si es una situación que espera tiene que manejar.

Hay una gran publicación en todo esto en el contexto de JQuery Ajax parameters here.

+2

+1. El analizador de parámetros Rails params sobrescribirá el valor a menos que tenga el [] presente. – Tilendor

0

Envíe sus datos como XML o JSON y analice lo que necesite de él.

+0

Debería haber indicado anteriormente que tengo que admitir pares clave/valor urlencoded como lo maneja un navegador típico. Editaré mi pregunta para reflejar eso. – randombits

Cuestiones relacionadas