Ресурс AngularJS и метод put

Хорошо, я боролся с этим в течение нескольких часов. Я использую .NET Web API в качестве серверной части и должен признать, что не совсем понимаю, как это работает. Я считаю, что REST API очень неявный, и когда что-то работает, оно работает из-за какой-то магии, то есть потому, что имя функции начинается с Get, затем это происходит и т. д. и т. д.

Вот что я пытаюсь сделать:

В моем контроллере веб-API (NotesController) у меня есть этот метод:

public HttpResponseMessage Put(string date, string notes)

Он получает дату в формате гггг-мм-дд и произвольный текст.

Я объявил свой ресурс в Angular следующим образом:

App.factory('NotesFactory', function ($resource) {
    return $resource('/api/Notes/', {}, { update: { method: 'PUT' } });
});

Наконец, у меня есть метод saveNotes() в моем контроллере заметок Angular, например:

$scope.saveNotes = function ()
{
    NotesFactory.update({ date: date, notes: $scope.notes }, function () {
    ...
    });
}

У меня возникают проблемы с тем, чтобы метод update() правильно вызывал метод Put() в моем веб-API.

Ошибка, которую я получаю:

"Действие на контроллере Notes, соответствующее запросу, не найдено"

Как я уже сказал, я не уверен, как именно это должно работать. Был бы очень рад, если бы кто-то мог привести конкретный пример, который работает для моей ситуации. Я уже читал документацию $resource туда и обратно безрезультатно.

Есть берущие? :-)


person HaukurHaf    schedule 02.06.2013    source источник


Ответы (1)


angular передаст ваш запрос как JSON внутри тела:

{ 
"date": "2013-06-03", 
"notes": "My notes" 
}

Поэтому наиболее подходящим было бы создание объекта, представляющего эти значения:

public class MyObject
{
    public DateTime Date { get; set; }
    public string Notes { get; set; }
}

А затем настроить сигнатуру метода

public HttpResponseMessage Put(MyObject obj)

Веб-API десериализует содержимое сообщения (JSON в теле) и создаст экземпляр MyObject. Подпись с простыми типами будет полезна в случаях, когда эти параметры являются частью URL. Попробуйте прочитать это для получения дополнительной информации http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

person Radim Köhler    schedule 02.06.2013
comment
Спасибо! Поняв, что простые типы следует передавать через строку запроса, я внес некоторые изменения в определение ресурса: app.factory('NotesFactory', function ($resource) { return $resource('/api/Notes/', { дата: '@date', примечания: '@notes'}, { обновление: { метод: 'PUT' } }); }); Это сообщает ресурсу, что параметры даты и примечаний доставляются через строку запроса, а не как часть тела. Теперь все работает как положено и мне не пришлось писать POCO для переноса данных. Ссылка, которую вы предоставили, хорошо читается. - person HaukurHaf; 02.06.2013
comment
Отлично, если это помогло, но решение за вами! ;) - person Radim Köhler; 03.06.2013