Как добавить новые данные с помощью службы REST, а не службы стиля RPC? - PullRequest
5 голосов
/ 10 января 2009

Я все еще изучаю REST и в своем тесте придумал сценарий, с которым не знаю, как справиться.

У меня есть пример службы WCF, которая использует Linq-to-Sql. Это чрезвычайно простая база данных с одной таблицей под названием «Задачи», которая имеет четыре поля: Id, Description, IsCompleted и EnteredDate. (Я упоминал об этом, потому что в самой службе не определены контракты на данные, все это происходит из контекста, созданного Linq.)

Получение данных было тривиальным для преобразования в REST ... как удаление данных. Однако вставка новых записей выглядит не так просто.

Моя контрактная операция в стиле RPC выглядит следующим образом:

    [OperationContract]
    void AddTask(string description);

Id, IsCompleted и EnteredDate не нужны, поскольку реализация службы выглядит следующим образом:

    public void AddTask(string description)
    {
        TaskListLinqDataContext db = new TaskListLinqDataContext();
        Task task = new Task() 
           { Description = description, IsCompleted = false, 
             EntryDate = DateTime.Now };

        db.Tasks.InsertOnSubmit(task);
        db.SubmitChanges();
    }

Идентификатор является идентификатором и поэтому обрабатывается базой данных.

Моей первой мыслью было оформить контракт на операцию следующим образом:

    [WebInvoke(Method="PUT", UriTemplate="tasks/{description}")]
    [OperationContract]
    void AddTask(string description);

Но я не знаю, как заставить это работать. Когда я пытаюсь использовать Fiddler, чтобы добавить это, он возвращает результат 411 (длина требуется).

Каков был бы правильный способ сделать это? Должен ли я переписать реализацию, чтобы принять весь документ XML, представляющий новую запись?

Ответы [ 5 ]

3 голосов
/ 11 февраля 2009

Результаты:

Я наконец нашел хороший пост в блоге , который помог мне решить эту проблему. Оказывается, я почти все делал правильно, но я неправильно проверял Фиддлера. Я также добавил еще несколько деталей к своему атрибуту.

[WebInvoke(RequestFormat = WebMessageFormat.Xml, 
           ResponseFormat = WebMessageFormat.Xml,
           Method = "POST", UriTemplate = "tasks/{description}", 
           BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
void AddTask(string description);

Когда я поместил свой Uri в Fiddler, он должен был выглядеть так:

http://ipv4.fiddler:8054/tasks/this+is+a+sample+desc+that+works

Теперь мой сервис правильно принимает данные и может добавить задачу в базу данных.

1 голос
/ 17 января 2009

Взгляните на WCF REST Starter Kit , который можно загрузить с CodePlex здесь .

0 голосов
/ 11 января 2009

В зависимости от требований, вы могли бы просто включить обычный CRUD через Astoria? У меня есть серия статей о том, как сделать это с LINQ-to-SQL здесь . Просто мысль.

0 голосов
/ 15 января 2009

Если вы хотите создать веб-службу RESTful, не используйте приложение WCF. Измените шаблон URI на что-то вроде Task / new и поместите данные новой задачи в тело HTTP-запроса POST. Я реализую веб-службы RESTful в ASP.NET в качестве общих обработчиков (* .ashx). Это позволяет мне подготовить метод http и перейти оттуда.

* Кевин 1003 *

0 голосов
/ 10 января 2009

Я думаю это в значительной степени описывает, как добавить элемент в контейнер спокойным способом.

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