Очень простые результаты 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("&");
}
}).
Ответ 2
Я нашел сообщение в блоге, которое исправило мою проблему:
http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/
Спасибо всем за то, что помогли мне!