RESTful Quiz Представление - PullRequest
       0

RESTful Quiz Представление

3 голосов
/ 28 февраля 2012

Я строю викторину. Пользователь может выбрать тему и ответить на 5 вопросов. После каждого вопроса они просматривают ответ. Я пытаюсь придерживаться строгого представления RESTful этого рабочего процесса, но на самом деле не могу остановиться на схеме URL. Например:

Пользователь Джо выбирает тему спорта и готов увидеть первый вопрос. URL-адрес

user/joe/subject/sport/question/1

Когда он отправляет свой ответ «B» (это тест с несколькими вариантами ответов), Джо создает новый ответ, и мы отправляем на

user/joe/subject/sport/question/1/answer/B

перед просмотром правильного ответа на

user/joe/subject/sport/answer/1

затем мы смотрим на следующий вопрос по

user/joe/subject/sport/question/2

Все это, очевидно, слишком сложно. Как бы вы подошли к этой проблеме RESTful способом?

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

Для меня основная идея в REST-сервисе - это «ресурс».Сначала вам нужно определить свои ресурсы.

Итак, есть пользователь, и он начинает новую викторину.

  • POST / user / joe / quiz.
  • Возвращает: Местоположение: / user / joe / quiz / 1

Затем пользователь выбирает спортивный вопрос, поэтому вы обновляете свой опрос, чтобы включить случайный (выбранный сервером) вопрос,

  • POST / пользователь / joe / quiz / 1 -> Тема: sport
  • Возвращает: Местоположение: / user / joe / quiz / 1 / question / 1

Пользователь отвечает:

  • PUT / user / joe / quiz / 1 / question / 1 -> Ответ B

Теперь промойте и повторите.

Ресурсы, которые мы получили:

  • Пользователи
  • Викторина для пользователя
  • Вопросы в викторине (Вопрос обновляется с ответом)
1 голос
/ 28 февраля 2012

Начните с этой презентации . Это отличный ресурс для разработки RESTful API. Имея это в виду, вот несколько стартовых предложений:

  1. URL-адреса RESTful имеют неявную иерархию. Удалите информацию пользователя из URL. Он принадлежит в заголовках HTTP.

    /subject/sport/question/1
    /subject/sport/question/1/answer/B
    /subject/sport/answer/1
    /subject/sport/question/2
    
  2. Я не вижу никакой полезной информации, добавленной частью subject. subject идентифицируется (в вашем примере) sport.

    /sport/question/1
    /sport/question/1/answer/B
    /sport/answer/1
    /sport/question/2
    
  3. Категории должны быть во множественном числе.

    /sports/questions/1
    /sports/questions/1/answers/B
    /sports/answers/1
    /sports/questions/2
    
  4. Когда вы POST отвечаете на вопрос, вы не POSTing к добавляете новый ресурс ответа (то есть определяете новый возможный ответ). Разве вы не размещаете сообщение на существующем ресурсе?

  5. Вы ничего не упомянули о HATEOAS. Если вы действительно собираетесь внедрить REST, вы должны делать что-то вроде , предоставляя "следующие" ссылки в гипермедиа.

0 голосов
/ 28 февраля 2012

Я бы полностью удалил /user/joe из маршрутов. Вы можете получить current_user с помощью Devise, Authlogic или какой-либо другой инфраструктуры аутентификации.

В остальном это выглядит нормально для меня, так как это всего два гнезда, которые достаточно читабельны. Итак, у вас будет:

GET subjects/sports/questions/1
POST subjects/sports/questions/1 # pass along params with {:answer => 'B'}
GET subjects/sports/answers/1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...