URL-адреса RESTful: «непрактичные» запросы и запрос одного из двух параметров запроса - PullRequest
1 голос
/ 24 августа 2010

У меня есть URL-адрес RESTful, для которого требуется параметр запроса offset или prefix (но не оба).

GET /users?offset=0&count=20
GET /users?prefix=J&count=20

Каков наилучший способ применения этого правила?Spring имеет аннотацию @RequestParam со свойством required для необязательных параметров, но я хочу применить правило «или-или» для этих двух параметров.Я знаю, что мог бы сделать это в коде, но есть ли другой способ сделать это?

Кроме того, как правильно обрабатывать «непрактичные» запросы?Скажем, у меня 100 миллионов пользователей;следующий запрос, хотя и должным образом RESTful, я не хочу поддерживать:

GET /users <-- Gets all 100 million users, crashes server and browser!

Что я должен отправить обратно?

Ответы [ 2 ]

2 голосов
/ 24 августа 2010

Вы можете создать два метода и выбрать один из них с атрибутом @RequestMapping params:

@RequestMapping(..., params = {"prefix", "!offset"})
public String usersWithPrefix(@RequestParam("prefix") ...) { ... }

@RequestMapping(..., params = {"offset", "!prefix"})
public String usersWithOffset(@RequestParam("offset") ...) { ... }
0 голосов
/ 25 августа 2010
  • Как правильно обрабатывать «непрактичные» запросы?

Менее практикуемые принципы REST включают требование, чтобы ресурсы были "обнаруживаемыми". Если вас просят предоставить полный список из 800 миллионов пользователей, и вы не хотите его предоставлять, вы можете вместо этого рассмотреть вопрос об обслуживании страницы, которая каким-то образом описывает, как фильтровать коллекцию: например, документ XForms или HTML, содержащий Элемент FORM с полями для смещения / префикса / счетчика или шаблон URI с соответствующими параметрами

Или вы можете просто отправить сообщение об ошибке «Слишком большая сущность 413» - изменить: нет, вы не можете. Извините, я неправильно прочитал описание того, для чего предназначен этот код

Если вы решите пойти по пути простой отправки первой страницы, думаю, я бы отправил ее в виде HTTP-перенаправления на / users? Offset = 0 & count = 20, чтобы у клиента было лучшее представление о том, чего у него нет полная коллекция (и если ваш ответ содержит ссылку для доступа к последующим страницам, даже лучше)

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