В моем клиенте Ангулархс я посылаю этот POST
...
entidades = [];
entidades = procesaEntidades();
$http.post('http://blabla/entidades',JSON.stringify(entidades))
.then(function(){alert('ok')},function(err){alert('error');});
На моем сервере Odata у меня есть этот controller, который я не является возможным достигать:
public class EntidadesController : ODataController
{
public async Task<IHttpActionResult> Post(IEnumerable<Entidad> entidades)
{
// TODO: Add create logic here.
var x = entidades;
//ACTUALIZA BASE DE DATOS BLA BLA BLA
...
Проблема состоит в том, что я не могу достигать controller, и клиент бросает мне следующую ошибку:
'ODataFeedDeserializer' does not support Read
Исследуя немного, оказывается, что Odata не может получать коллекции (?)
Остальное правильно, которым, если я посылаю единственную организацию и меняю определение controller, я получаю организацию правильно:
Клиент
$http.post('http://blabla/entidades',JSON.stringify(entidades[0]))
.then(function(){alert('ok')},function(err){'error'});
Сервер
public async Task<IHttpActionResult> Post(Entidad entidad)
{
//entidad recibida correctamente
Почему я не могу POST (ear) коллекции от AngularJS до Odata?
Как я могу POST (ear) коллекции от AngularJS до Odata?
РЕДАКТИРОВАНИЕ:
Версии sofware
OData позволяет реализовывать операции на нескольких организациях с одной peticiГіn Веб используя функциональность , обработанный частями
В большие черты, эта функциональность состоит в соединении каждой из просьб, которые enviarГ-an индивидуально в Гєnica peticiГіn типа multipart .
Каждый из блоков, которые составляют эту peticiГіn, идентифицируют формы Гєnica, чтобы позже мочь извлекать результат, который соответствует ему. У
construcciГіn этих просьб есть некая комплексность, потому что нужно работать на низком уровне с заголовками и контентом ее peticiГіn
, К счастью существует проект в так называемом GitHub угловых - http-batcher , который делает эту работу формы trasparente превращая несколько Веб просьб, реализованных с услугой $http в одну peticiГіn batch.
Используя cГіdigo примера, который включается в проект, чтобы реализовывать одну peticiГіn mГєltiple:
$http.get('http://localhost:8080/api/products').then(function (data) {
console.log('success on batch call No.0 - ' + data.data);
}, function (err) {
console.log('error on batch call No.0 - ' + err);
});
$http.get('http://localhost:8080/api/products/2').then(function (data) {
console.log('success on batch call No.1 - ' + data.data);
}, function (err) {
console.log('error on batch call No.1 - ' + err);
});
$http.put('http://localhost:8080/api/products', {
Name: 'Product X',
StockQuantity: 300
}).then(function (data) {
console.log('success on batch call No.2 - ' + data.data);
}, function (err) {
console.log('error on batch call No.2 (This is expected - just to illustrate an error in one of the batched requests) - ' + angular.fromJson(err));
});
Она peticiГіn посланная серверу - следующий:
В GitHub tambiГ©n включает этот проект , который осуществляет сервер OData используя Веб API 2, в котором возможно видеть, как конфигурируется маршрут, который принимает просьбы batch OData:
config.Routes.MapHttpRoute(
name: "BatchApi",
routeTemplate: "api/batch",
defaults: null,
constraints: null,
handler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer));
Почему я не могу POST (ear) коллекции от AngularJS до Odata?
Это ограничение самого Odata
, уже существует просьба для того, чтобы он был осуществлен.
Как я могу POST (ear) коллекции от AngularJS до Odata?
Чтобы решать проблематику я предлагаю 2 вещи:
1. Делать batching
Организаций и посылать их 1 1.
Вместо того, чтобы производить твою просьбу с одним Enumerable
создай функцию, которая получала бы организации одна в одну. Вместо того, чтобы делать один POST
для всех организаций его становится одним POST
из-за каждой организации.
В твоем случае:
Драйвер
public class EntidadesController : ODataController
{
public async Task<IHttpActionResult> Post(Entidad entidad)
{
// TODO: Add create logic here.
var x = entidad;
//ACTUALIZA BASE DE DATOS BLA BLA BLA
...
2. Получать организации с Query
Только, если возможно, что твоя функция procesaEntidades()
будьте replicable в Query Организаций ты мог бы перемещать только необходимые параметры, чтобы делать Query управляющей и внутри этой получать все организации одновременно.
А именно, удалять в полного отправление / обвиняемого Организаций в POST и заменять это на логику твоей функции procesaEntidades()
:
AngularJS
...
//entidades = [];
//entidades = procesaEntidades();
$http.post('http://blabla/entidades',JSON.stringify(logicaQuery))
.then(function(){alert('ok')},function(err){alert('error');});
Драйвер
public class EntidadesController : ODataController
{
public async Task<IHttpActionResult> Post(String logicaQuery)
{
//Realizar una Wuery sobre las entidades (Con Linq)
...
Также отмечать, что в этом вопросе первоначального SO они сделали интересный workaround с Query
.
ты не был бы должен использовать просьбу post, если не скорее patch, так как ты хочешь послать набор, post 1 в 1, patch - набор, ты был бы должен понимать сначала, что он odata и API REST FULL, он читает эту таблицу и анализирует хорошо тему твоего api.
http://www.restapitutorial.com/lessons/httpmethods.html
кроме того, оставил тебе соединение, где кто-то уже спросил, как