Как работает веб-API? Являются ли сигнатуры HTTP-методов в бэкенде строгими?

Работая над небольшой задачей, у меня возникли проблемы с контроллером веб-API.

В моем API есть 2 метода:

[HttpGet]
public IHttpActionResult FetchAll()

[HttpPost]
public IHttpActionResult CreateNew(int? taskType, string taskName = null)

Который я использую для управления задачами в db. 1-й (FetchAll) отлично работает как из специальных утилит типа Postman, так и выводит какие-то результаты в консоль браузера.

Но! Если использовать второй (CreateNew), возникают некоторые проблемы.

Как я тестировал в Postman, он отлично работает:

введите здесь описание изображения

Но если использовать мою интерфейсную часть приложения (JS):

var App = function () {
    this.init();
};
App.prototype.init = function () {
    var self = this;

    $.post(
        '/api/task/createNew',
        { taskName: "smth new", taskType: 0 }
    );

    $.get(
        '/api/task/fetchAll',
        function ( sender ) {
            console.log(sender);
        }
    );
};

window.onload = function () {
    var app = new App();
};

Проблема с методом POST. Во-первых, я думаю, что использую jQuery неправильно, но, читая следующие ссылки, я понимаю, что все правильно с использованием jQuery:

Также я проверил в браузере детали неудачного запроса:

введите здесь описание изображения

Как вы можете видеть, данные POST были переданы правильно при использовании jQuery, но я также допускаю одну деталь: it's form data.

Итак... Данные формы - это тип данных, которые отправляются с application/x-www-form-urlencoded и не представлены как часть URL.

Если использовать в JS-части следующий код:

$.post( '/api/task/createNew?taskName=smth new&taskType=0' );

Все начинает работать.

А Web API, похоже, не поддерживает операции с данными Forms, и поэтому тест Postman работает хорошо (если еще раз посмотреть на старый скриншот), потому что он использует параметры URL, а не формирует их.

Но я думаю, что отправлять данные POST с использованием параметров URL довольно некрасиво, как для архитектуры REST, так и для использования их в коде JavaScript (вы будете генерировать строку, а не обычно использовать Object представление для данных, что может быть рассмотрено как плохая OO-структура ).

Я прочитал об обработке форм в WebAPI здесь: Есть ли способ обрабатывать данные сообщений формы в контроллере Web Api?

Итак, существуют ли какие-то способы решить мою проблему с более красивым стилем кода и т. Д. (Это означает, что не нужно генерировать строки URL и т. Д.)?

ПС

Файлы проектов, которые были описаны здесь, доступны:


person Community    schedule 14.08.2014    source источник


Ответы (1)


Как объяснено в вопросе, который вы связали с вашим почтовым действием веб-API, должен принимать объект, содержащий нужные вам поля:

public IHttpActionResult CreateNew(NewTask task)
{
     // do something with task.TaskType and task.TaskName here
}

public class NewTask
{
    public int? TaskType { get;set; }
    public string TaskName { get; set; }
}
person Richard Dalton    schedule 14.08.2014