2014-11-25 14 views
0

Я разрабатываю API REST на основе спецификации HAL. API разрабатывается на PHP с помощью Symfony, и клиент строится в angularjs. API должен возвращать некоторые списки, и они будут показаны с использованием ngtables library, и потребуются параметры фильтрации, в идеале, в формате, который использует ngtables, например, в this sample.Передача массива с ключом и REST API после HAL

{ "name": "M", "age": "4" } 

(Конечно будущие клиенты могут использовать одни и те же параметры.)

Моего фронтенда-напарник предлагает, чтобы я отправить JSON закодированные непосредственно в качестве параметра в URL, как это:

?filter=%7B%20%22name%22%3A%20%22M%22%2C%20%22age%22%3A%20%224%22%20%7D%20 

Я не очень уверен в этом.

Я читал, как отправлять массивы по URL-адресу с параметром param[]=foo&param[]=bar, но это означает, что у него есть один ключ для нескольких значений. В моем случае мне нужно иметь возможность посылать разные значения ключей для массивов, как это делает объект Json.

Мне интересно, как должен быть URL-адрес запроса от клиента, чтобы иметь возможность включать все параметры фильтра внутри одного параметра, и если есть какой-либо стандартный способ сделать это.

EDITED: После @Ross_Turner Я хочу пояснить, что мое намерение передать массив значений ключа внутри параметра состоит в том, что у нас будет другой тип параметра. Например:

?filter=<my key-value array>&page=1&limit=50&anotherParam=whatever 

Даже мы хотели бы использовать другой параметр, содержащий другой массив ключ-значение, как это:

?filter=<my key-value array>&sorting=<another key-value array>&page=1&limit=50 

Где filter и sorting могут иметь одинаковые ключи.

ответ

1

В настоящее время нет стандартного способа отправки запросов в запросах GET. Таким образом, у вас есть 2 варианта: вы используете свой пользовательский язык запросов (например, вы уже пробовали) или вы выбираете стандартный язык запросов. В любом случае это сложно сделать RESTful, потому что вам нужно создать ссылку, содержащую рецепт создания такого URI. Вы, вероятно, можно использовать URI templates, но иногда они не являются достаточно общими ...

@Ross Тернер:

Я думаю, вы поняли, я говорил о не стандарт. Ofc. существуют нестандартные решения на основе строки запроса, например RQL. Или вы можете отправить стандартный запрос SPARQL в один параметр, но нет стандартного способа описания такой ссылки, и без описания ссылок вы не сможете сгенерировать запрос в клиенте REST, поэтому он не будет слабо связан, и поэтому он будет нарушать унифицированное ограничение интерфейса.

0

Я не согласен с ответом @ inf3ero - наверняка есть очень четко определенный способ отправить запрос как часть параметров запроса GET - запроса. Если вы хотите использовать разные комбинации клавиш и значений, это ключ от ключей и значений параметров запроса, поэтому в вашем примере вы, вероятно, должны использовать ?name=M&age=4 и проанализировать каждый из них на своем сервере. Это должно быть достаточно простым для преобразования в это путем итерации по клавишам в объекте JSON.Я не уверен, почему вы хотели бы объединить их в один параметр, если вы пытаетесь внедрить RESTful API в соответствии со спецификацией HAL.

+0

Я только что отредактировал свой вопрос, пытаясь выяснить, почему я пытаюсь отправить массив значений ключа внутри параметра, имея возможность разрешать такие запросы, как этот '? Filter = & sorting = <другой ключ -value array> & page = 1 & limit = 50', где 'filter' и' sorting' могут иметь один и тот же ключ. –

+1

А теперь я вижу, что в этом случае вам нужны только ключи и значения для параметров, которые вы хотите фильтровать, что должно означать, что только сортировка - это проблема, поскольку вам нужно указать ключи, независимо от того, являются ли они восходящими и нисходящими, а также какой порядок. Если вы должны поддерживать несколько значений сортировки, то вроде '? Name = M & age = 4 & sortBy = name + asc, age + desc'. Я настоятельно рекомендую вам использовать ключи фильтрации и значения как только параметры запроса в запросе GET, так как это довольно стандартный способ запроса ресурса RESTful. –

+0

Спасибо @ RossTurner. Что делать, если использовать другие параметры, такие как '? Page = 1 & limit = 50'. Правильно ли иметь «имя» или «возраст» на том же уровне? –

Смежные вопросы