Обработка нескольких параметров в URI (RESTfully) в Java - PullRequest
4 голосов
/ 25 мая 2011

Я работал над небольшим веб-сервисом на Java / Jersey, который считывает списки пользовательской информации от клиентов, содержащиеся в файлах XML. В настоящее время у меня есть это функционирование во всех аспектах, кроме одного: использование нескольких параметров в URI для обозначения извлечения нескольких наборов пользовательской информации или нескольких наборов клиентской информации. У меня есть версия, которая в настоящее время работает, но это не лучший способ и не то, к чему призывает описание проекта.

В настоящее время мой код выглядит так:

@Path("Client/{client}/users")
public class UserPage 
    {
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String userChoice(@PathParam(value = "client") final String client) 
    {****Method here which handles a list of 'users'****}

@GET
@Path("{name}")
@Produces(MediaType.TEXT_HTML)
public String userPage(@PathParam(value = "client") final String client, @PathParam(value = "name") final String name)
    {****Method here which handles 'user' information****}

Первый метод обрабатывает список пользователей из «клиента», обозначенного как «{клиент}» в URI. Второй метод доставляет «пользовательскую» информацию, обозначенную «{name}» в URI. Оба будут работать с одним аргументом. В настоящее время для обработки нескольких 'пользователей' у меня запятая "{name}", например "Client / Chick-Fil-A / users / Phil, Bradley". Я могу разобрать это после использования @PathParam и создать массив этих «пользователей», но опять же, я чувствую, что это не лучший способ справиться с этим, и описание проекта требует чего-то другого.

Есть ли способ выполнить эту же задачу с помощью URI, отформатированного как "Client / Chick-Fil-A; cd = Phil, Bradley"? (; CD = это то, что доставляет мне больше всего проблем.) Мне также нужно иметь возможность использовать этот формат для нескольких клиентов, то есть "Клиент; CD = Chick-Fil-A, Метро / пользователи; CD = Фил, Брэдли".

Редактировать: Для уточнения проекта: Информация о клиенте содержится в 6 отдельных файлах. Каждый из этих файлов имеет 3 одинаковых пользователя (это доказательство концепции, по сути). Мне нужно иметь возможность получать разные подмножества информации, например, пользователя Phil из McDonalds и Chick-Fil-A, или пользователей Phil и Peter из McDonalds, или пользователей по имени Peter со всех клиентов и т. Д.

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Вы не можете использовать '=' в пути URL, поскольку это зарезервированный символ. Однако есть много других символов, которые вы можете использовать в качестве разделителей, таких как '-' и ','. Так что вместо '=' вы можете использовать '-'. Если вы действительно хотите использовать '=', вам придется кодировать URL it; однако я настоятельно рекомендую против этого, потому что это может усложнить ситуацию, чем должно быть.

Вы можете увидеть грамматику строки URL здесь:

http://www.w3.org/Addressing/URL/url-spec.txt

Скопируйте и найдите следующую строку, чтобы перейти к грамматике пути:

 path                    void |  segment  [  / path ] 

 segment                 xpalphas

Тем не менее, я считаю, что HTTP-запрос обычно используется только для запроса одного ресурса. Поэтому мое личное мнение - не внедрять услугу так, как вы внедрили. Для получения нескольких клиентов я бы использовал параметры запроса в качестве фильтров:

Client/{cName}/users?filters=<value1>,<value2> ...

Редактировать: Из бизнес-кейса, который у вас есть, кажется, что вам, вероятно, нужен сервис типа

/users?<filters>
/clients?<filters>

Скажем, вы хотите получить Питера от всех клиентов, тогда можете запросить эту форму:

/users?name=Peter

Точно так же, если вы хотите получить Джека и Питера из Starbucks, тогда вы можете сделать:

/users?name=Peter,Jack&client=Starbucks

Надеюсь, это поможет.

2 голосов
/ 25 мая 2011

Строки запроса имеют следующий синтаксис, и вы можете иметь несколько параметров с одинаковым именем:

http://server/path/program?<query_string>

где строка запроса имеет следующий синтаксис:

field1=value1&field1=value2&field1=value3…

Для более подробной информации проверьте эту запись в Википедии: http://en.wikipedia.org/wiki/Query_string

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...