Несколько пар ключ / значение в HTTP POST, где ключ это одно и то же имя - PullRequest
7 голосов
/ 11 апреля 2010

Я работаю над API, который принимает данные от удаленных клиентов, некоторые из которых, где ключ в HTTP POST почти функционирует как массив. По-английски это означает, что у меня на сервере есть ресурс под названием «класс». В этом смысле класс - это тип, в котором учится ученик и учитель. Когда пользователь отправляет HTTP-запрос POST для создания нового класса для своего приложения, многие пары ключ-значение выглядят следующим образом:

имя студента: Боб Смит
Имя студента: Джейн Смит
Имя студента: Крис Смит

Каков наилучший способ справиться с этим как на стороне клиента (скажем, клиент - cURL или ActiveResource, что угодно ...), так и на приемлемый способ обработки этого на стороне сервера, если мой сервер является Ruby on Rails приложение? Нужен способ, позволяющий использовать несколько ключей с одним и тем же именем без столкновения пространства имен или потери данных.

Мое требование должно состоять в том, чтобы данные POST представляли собой пары ключ / значение в формате urlencoded.

Ответы [ 2 ]

21 голосов
/ 11 апреля 2010

Есть два способа справиться с этим, и от вашей клиентской архитектуры будет зависеть, как вы будете это делать, поскольку стандарты HTTP не упрощают ситуацию.

Традиционно, HTTP-запросы просто используют один и тот же ключ для повторяющихся значений и оставляют это на усмотрение клиентской архитектуры, чтобы понять, что происходит. Например, у вас может быть пост-запрос со следующими значениями:

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

Когда получающая архитектура получит эту строку, она должна будет понять, что существует несколько ключей student_name и действовать соответственно. Обычно это реализовано так, что если у вас есть один ключ, создается скалярное значение, а если у вас есть кратные значения одного и того же ключа, значения помещаются в массив.

Современные клиентские архитектуры, такие как PHP и Rails, используют другой синтаксис. Любой ключ, который вы хотите считать в виде массива, добавляется в квадратные скобки, например:

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

Принимающая архитектура создаст структуру массива с именем «student_name» без скобок. Синтаксис в квадратных скобках решает проблему невозможности отправки массива только с одним значением, которое не может быть обработано «традиционным» методом.

Поскольку вы используете Rails, лучше использовать синтаксис в квадратных скобках. Если вы думаете, что можете переключаться на серверную архитектуру или хотите распространять свой код, вы можете изучить более независимые методы, такие как JSON-кодирование отправляемой строки, что добавляет накладные расходы, но может быть полезно, если вы ожидаете, что ситуация должен справиться.

Здесь есть отличный пост об этом в контексте параметров JQuery Ajax .

0 голосов
/ 11 апреля 2010

Отправляйте свои данные в формате XML или JSON и анализируйте все, что вам нужно, из них.

...