Очень простые результаты AngularJS $http POST в "400 (неверный запрос)" и "Недействительный код состояния HTTP 400"

У меня очень простой .NET Web API, размещенный в Azure, с двумя очень простыми способами:

[EnableCors(origins: "http://simpleapiearl.azurewebsites.net", headers: "*", methods: "*")]
public class EnvelopesController : ApiController {
    // GET: api/Envelopes
    public IEnumerable<string> Get() {
        return new string[] { "value1", "value2" };
    }

    // POST: api/Envelopes
    public string Post([FromBody]Envelope env) {
        return "rval: " + env + " (and my addition to env)";
    }
}

Я создал простой plunk, чтобы вызвать эти методы. В моем коде AngularJS я делаю два очень простых вызова $http. GET отлично работает. Однако POST всегда возвращает "400 (неудачный запрос)", а затем вскоре в моей консоли WebStorm с помощью "XMLHttpRequestion не может загрузить... Недопустимый код состояния HTTP 400".

Любые предложения приветствуются!

ИЗМЕНИТЬ!!

Привет, спасибо за очень быстрые ответы. Я просто понял, что забыл добавить некоторые очень важные детали.

Параметр моего метода POST - это то, что я называю объектом Envelope, который содержит два свойства: listingId (int) и Description (string). Когда я добавляю заголовок Content-Type с urlencoded и передаю '{"listingId":1234, "Description":"some description"}' в качестве моих данных POST, параметр env в моем методе POST на сервере равен NULL (то есть, похоже, он не может разобрать JSON, который я предоставляю). Извините, это было опущено с оригинального сообщения.

Ответ 1

Я думаю, что этот пост будет полезен.

Как я могу получить POST данные с urlencoded с $http в AngularJS?

По умолчанию служба $http преобразует исходящий запрос посредством сериализуя данные как JSON, а затем отправляя их с помощью контента, type, "application/json". Когда мы хотим опубликовать значение в качестве ФОРМЫ post, нам нужно изменить алгоритм сериализации и опубликовать данные с типом контента "application/x-www-form-urlencoded".

Это измененный plnkr от вашего. В вашем коде отсутствует преобразование JSON в кодированный URL.

http://plnkr.co/edit/4aeEDz73qgHSfOv1sBgn?p=preview

$http({
    method: 'POST',
    url: 'http://simpleApiEarl.azurewebsites.net/api/envelopes',
    data: env,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    transformRequest: function(obj) {
      var str = [];
      for(var p in obj)
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
      return str.join("&");
    }
  }).