Обрабатывать из-за частей коллекцию организаций в OData

В моем клиенте Ангулархс я посылаю этот 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

  • "Microsoft. AspNet. OData" версия = "5.8.0" targetFramework = "net451"
  • "Microsoft. AspNet. WebApi" версия = "5.2.3" targetFramework = "net451"
  • "Microsoft. AspNet. WebApi. OData" версия = "5.3.1" targetFramework = "net451"
  • AngularJS 1.5.0
8
задан 19.07.2016, 21:18
3 ответа

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 посланная серверу - следующий:

introducir la descripción de la imagen aquí

В 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));
3
ответ дан 24.11.2019, 14:45

Почему я не могу 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.

1
ответ дан 24.11.2019, 14:45
  • 1
    PSI Ссылка в эту просьбу плохо. Он указывает на другой не связанный issue, и который закрылся, и полно. –  rnrneverdies 19.07.2016, 14:04
  • 2
    Привет, что est и # 225; ища это как обновление нескольких организаций в одном и #250; nica petici и # 243; n, используя опору для , обработанного частями из ODATA. Таким образом, предположительно, actualizaci и # 243; n организаций реализовывать и # 237; в в том же transacci и # 243; n базы данных –  rsciriano 19.07.2016, 18:04

ты не был бы должен использовать просьбу post, если не скорее patch, так как ты хочешь послать набор, post 1 в 1, patch - набор, ты был бы должен понимать сначала, что он odata и API REST FULL, он читает эту таблицу и анализирует хорошо тему твоего api.

http://www.restapitutorial.com/lessons/httpmethods.html

кроме того, оставил тебе соединение, где кто-то уже спросил, как

реализует просьбу patch с angularjs https://stackoverflow.com / questions / 20000176/patch-request-using-angularjs

0
ответ дан 24.11.2019, 14:45
  • 1
    Привет, одинокий OData допускает просьбы patch на одном и #250; nica организация, чтобы обновлять несколько организаций сразу, нужно реализовывать petici и # 243; n batch, это объяснил немного лучше в мой ответ . Привет –  rsciriano 25.07.2016, 22:40
  • 2
    если ты это знаешь, потому что ты помещаешь как пример реализовывать petici и # 243; n типа post? –  Moisés Godoy 25.07.2016, 22:47
  • 3
    Если ты имеешь в виду пример, который есть в вопросе, он принадлежит первоначальному автору. Вначале вот то, что pretend и # 237; чтобы делать, и если ты читаешь в комментариях, сам автор понял, которого soluci и # 243; n был petici и # 243; n BATCH. Действительно, petici и # 243; n BATCH - типа POST и в teor и # 237; в puede включать просьбы всех видов GET , POST , УДАР В ЛУНКУ и даже PATCH В я на меня был похож и # 243; интересный, потому что я ставлю использовать OData, и в конце концов прибыл к soluci и # 243; n, который я имел. Привет –  rsciriano 25.07.2016, 23:01

Теги

Похожие вопросы