Обработка etags в пакетном запросе с использованием SAP Cloud SDK - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь выполнить пакетный запрос, включающий создание, обновление и удаление (все они разные продавцы). В соответствии с этим вопросом здесь , который имеет дело с чем-то похожим, я сделал поиск для элементов, которые хочу обновить и удалить, прежде чем добавить их в пакетный запрос. Я использую SalesOrder.builder () для подготовки SalesOrder, который я хочу создать.

 final ErpHttpDestination destination = DestinationAccessor.getDestination(DESTINATION_NAME)
                                    .asHttp().decorate(DefaultErpHttpDestination::new);

                    final SalesOrderItem salesOrderItem1 = SalesOrderItem.builder().material(material)
                                    .requestedQuantityUnit(requestedQuantityUnit).build();

                    final SalesOrder salesOrder1 = SalesOrder.builder().distributionChannel(distributionChannel)
                                    .salesOrderType(salesOrderType).salesOrganization(salesOrganization)
                                    .organizationDivision(organizationDivision).soldToParty(soldToParty)
                                    .item(salesOrderItem1).build();

                    final SalesOrder orderToUpdate = new GetSingleSalesOrderCommand(orderToUpdateID, destination,
                                    new DefaultSalesOrderService()).execute();
                    orderToUpdate.setSoldToParty(updateSoldToParty);

                    final SalesOrder orderToDelete = new GetSingleSalesOrderCommand(orderToDeleteID, destination,
                                    new DefaultSalesOrderService()).execute();

                    SalesOrderServiceBatch service = new DefaultSalesOrderServiceBatch(
                                    new DefaultSalesOrderService());

                    BatchResponse bRes = service.beginChangeSet().createSalesOrder(salesOrder1).updateSalesOrder(orderToUpdate)
                                    .deleteSalesOrder(orderToDelete).endChangeSet().execute(destination);

Затем я регистрирую BatchResponse и вижу, что я получаю Сбой Пакетного ответа:

eTag handling not supported for http method 'POST'

Я искал эту ошибку, но не могу найти ее решение. Любые идеи? Спасибо.

ОБНОВЛЕНИЕ: Увеличение регистрации до DEBUG. Я вижу отправляемый пакетный запрос и вижу, что в запрос на создание добавлен заголовок if-match, который не имеет смысла как он не может сопоставить то, что еще не существует.

 "msg":"--batch_123\r\nContent-Type: multipart/mixed; 
 boundary=changeset_(changeset number)\r\n\r\n--
 changeset_(changeset number)\r\nContent-Type: 
 application/http\r\nContent-Transfer-Encoding: binary\r\n\r\nPOST 
 /sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder HTTP/1.1\r\nContent- 
 Length:
193\r\nIf-Match: W/\"datetimeoffset'2020-05- 
 01T11%3A51%3A16.8631720Z'\"\r\nAccept: 
 application/json;odata=verbose\r\nContent-Type:......

Я получаю сообщение об ошибке:

  Inner Error:
 "msg":"batch 
  responseFailure(com.sap.cloud.sdk.odatav2.connectivity.ODataException: 
  null: <?xml version=\"1.0\" encoding=\"utf-8\"?><error 
  xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"> 
  <code>/IWFND/CM_MGW/537</code><message xml:lang=\"en\">eTag handling not 
  supported for http method 'POST'</message><innererror>...

Однако, что работает, если я упаковываю каждый запрос в его собственный набор изменений, например

 service
 .beginChangeSet().createSalesOrder(order).endChangeSet()
 .beginChangeSet().updateSalesOrder(orderToUpdate).endChangeSet()
 .beginChangeSet().deleteSalesOrder(orderToDelete).endChangeSet()
 .execute(destination);

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Это похоже на ошибку. Мне удалось воспроизвести это с другой службой, и поведение остается тем же: заголовок if-match также неправильно применяется к операции POST.

При отладке кажется, что запрос создается правильно с помощью заголовок присутствует только при обновлении и удалении. Однако, похоже, что когда пакетный запрос сериализуется в JSON, он добавляется ко всем запросам.

Поэтому, пока это не будет исправлено, обходной путь изолирует эти операции с помощью наборов изменений, как вы уже указали.

0 голосов
/ 30 апреля 2020

Похоже, что обработка eTag не поддерживается для вашей конечной точки.

Теперь вы можете сделать следующее, чтобы опустить заголовки eTag:

orderToUpdate.setVersionIdentifier(null); 
orderToDelete.setVersionIdentifier(null);

Однако я не уверен, как 'POST' соответствует описанию ошибки, потому что update использует PATCH, а delete использует DELETE. Единственный POST, который я ожидаю, будет от create . Но мы не добавляем заголовки для идентификаторов версии объекта (eTag) в операции создания OData. Если та же самая ошибка все еще появляется, пожалуйста, попробуйте снова без запуска createSalesOrder(salesOrder1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...