Соглашение URI для вставки и обновления - API WCF Rest - PullRequest
1 голос
/ 03 февраля 2011

У меня есть коллекция пользователей с пользовательскими.Пользователь - Id, FName, LName.

Для вставки я передаю экземпляр пользователя с Id, FName, LName.Служба вставляет пользователя, если его нет.

Для обновления я снова передаю экземпляр пользователя со всеми параметрами.Служба обновляет FName и LName для пользователя с указанным идентификатором.

Я хочу, чтобы вставка и обновление выполнялись как 2 отдельных метода в службе.

У меня не может быть одинаковых URI для обоих методов.Примерно так:

    [WebInvoke(UriTemplate = "Users", Method = "PUT")]
    void  UpdateUser(User instance);

    [WebInvoke(UriTemplate = "Users", Method = "PUT")]
    void  AddUser(User instance);

Какой лучший способ добиться этого?

Я не согласен с одним сообщением, в котором говорится, что URI обновления должен иметь что-то вроде:

    [WebInvoke(UriTemplate = "Users/{userId}", Method = "PUT")]
    void  UpdateUser(string userId, User instance);

Поскольку идентификатор пользователя уже присутствует в пользовательском экземпляре.

Хотя я согласен, что метод PUT может выполнять вставку и обновление.По какой-то причине мне нужно держать их отдельно.

Ответы [ 2 ]

3 голосов
/ 03 февраля 2011

PUT, являясь идемпотентной операцией, должно создать новый ресурс по URL-адресу, на который вы УСТАНАВЛИВАЕТЕ, или полностью заменить существующий ресурс (УСТАНОВИТЕ этот ресурс здесь).Если вы выполняете одно и то же PUT для одного и того же URL несколько раз, у вас все равно останется один и тот же ресурс.

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

Краткий ответ, сделайте вставкуоперация PUT и обновление POST.

Я думаю этот SO-ответ действительно хорошо объясняет это.

1 голос
/ 03 февраля 2011

Вы можете посмотреть на это несколькими способами

  • PUT - для обновлений, но если указанный идентификатор не существует, вставьте
  • POST - для создать, вставить столько раз, сколько это нравится, даже если вы передаете те же данные в несколько раз, так как игнорирует идентификаторы

Так что я бы сказал:

  • Добавить пользователя: / Users с POST (однако теоретически вы можете сделать это с помощью PUT).
  • Обновление пользователя: / Users / {userId} с помощью PUT

Как тогда было бы получить информацию о пользователе, / Users / {userId} с помощью GET ... или удалить пользователя, / Users / {userId} с помощью Delete.

Не уверен, поможет ли это или нет, если нет, то дайте мне знать, и я попробую еще раз: -)

...