ОТДЫХ URI для POST и возврата (GET) - PullRequest
3 голосов
/ 07 октября 2010

Извините за странный заголовок.Вот моя ситуация.

У меня есть таблица продуктов с названием и порядком отображения каждого продукта.Клиент может изменить порядок отображения товаров.Таблица генерируется с использованием jQuery.tmpl, а данные извлекаются с использованием GET в WCF.Продукты, извлеченные из базы данных, по CategoryID.

Когда пользователь изменяет порядок отображения продукта в сетке, продукт должен обновляться с использованием POST.После обновления данных сервер должен отправить обратно обновленный объект json для обновления таблицы.

ВОПРОС: Как мне структурировать мой POST URI для этого сценария?Вот что у меня есть сейчас.

 [OperationContract]
        [WebInvoke(
            Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Bare,
            UriTemplate = "product/form/{categoryId}")]
        [return: MessageParameter(Name = "products")]
        List<Product> UpdateProduct(string categoryId);

Я считаю, что мой URI для обновления ресурса правильный, так как я обновляю один продукт по идентификатору категории.Однако я хочу вернуть новый набор продуктов, основанный на изменениях, сделанных POST, и мне не нужно делать отдельный вызов GET.

Не уверен, что это «правильно».Эти рестораторы меня напугали!

Спасибо.

ОБНОВЛЕНИЕ Я начал больше думать о своем коде выше и понял, что здесь происходит больше.Реальность моей ситуации заключается в том, что я пытаюсь обновить конкретный продукт по ProductID, а затем возвращает список продуктов по CategoryID.По сути, ПОЧТА и ПОЛУЧИТЬ.Так будет ли мой URI выглядеть так?

[WebInvoke(
Method = "POST",
UriTemplate = "product/form/{productId}/products/{categoryId}")]
[return: MessageParameter(Name = "products")]
List<Product> UpdateProduct(string productId, string categoryId);

При таком методе?

public static List<Product> UpdateProduct(string productId, string categoryId)
{
ProductManager.UpdateProduct(int.Parse(productId));
return ProductManager.GetProducts(int.Parse(categoryId));
}

UPDATE2

Этот вопрос был решен здесь со ссылкой, предоставленной Даниилом.Хотя обработка всего в одном вызове POST, кажется, имеет смысл, я не думаю, что это соответствует духу REST и использованию Uri в качестве ресурсов.Использование POST, а затем вызов GET является ответом.Спасибо Даниилу.Его комментарии хороши.

1 Ответ

1 голос
/ 07 октября 2010
Запрос

A POST или PUT на обновление порядка отображения не должен возвращать ничего, кроме кода состояния, который указывает состояние запроса.Вам следует оформить отдельный запрос GET для получения нового списка лучших продуктов 15/25/50 / etc:

Если создан новый ресурс, сервер происхождения ДОЛЖЕН сообщить агенту пользователя черезответ 201 (Создан).Если существующий ресурс изменен, то должны быть отправлены коды ответа 200 (ОК) или 204 (Нет содержимого), чтобы указать успешное завершение запроса.Если ресурс не может быть создан или изменен с помощью Request-URI, СЛЕДУЕТ дать соответствующий ответ об ошибке, отражающий природу проблемы.

From: Раздел 9.6 спецификации HTTP 1.1

Вас также может заинтересовать HTTP-спецификация (разделы 9.5 и 9.6) и следующий пост переполнения стека:


Тем не менее, я могу подумать о двух способах обновления порядка отображения продуктов:

  1. Отправьте запрос на повышение или понижение для определенного идентификатора продукта.Этот запрос может быть вызван всякий раз, когда нажимается кнопка вверх / вниз.

  2. Отправить полный список order_rank для всей категории.

Я считаю,последнее более практично, но вы можете раскрыть обе операции.Для первого подхода глагол POST кажется подходящим, но для второго я бы использовал PUT.

Для первого подхода я бы представил URI, подобные следующему:

POST /products/{productId}/move-up
POST /products/{productId}/move-down

Вышесказанное предполагает, что мы создаем команду «двигаться вверх» или «двигаться вниз».Глагол POST означает «создать», а существительное (действие) - это команда «двигаться вверх» или «двигаться вниз», которая действует на определенный product_id.

Для второго подхода я бысм. URI, подобный следующему:

PUT /categories/{categoryId}/order-rank

К которому мы можем передать представление JSON / XML / etc для каждого product_id с номером order_rank.Глагол PUT означает «обновление», а существительное - «ранг порядка» для определенного идентификатора категории.

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