Объединение двух запросов POST с использованием httr - PullRequest
0 голосов
/ 08 декабря 2018

Мне нужно создать запрос POST, для которого нужен еще один запрос POST.

Итак, есть два разных POST-запроса, которые не могут быть выполнены по отдельности.Как я смогу объединить эти два запроса?

Для справки мне нужно отправить POST на Точный онлайн .У них есть документация REST API , которая должна упростить задачу.В моем примере я хочу создать новый заказ на покупку, найденный здесь .Есть два обязательных свойства: «Поставщик» и «Закупочные линии».Поставщика легко определить, но строки заказа на поставку создаются с помощью второго запроса POST .

По отдельности запрос POST для PurchaseOrderLines, например, будет выглядеть так:

POST(url = paste("https://start.exactonline.nl/api/v1/", division, "/purchaseorder/PurchaseOrderLines", sep = ""),
     add_headers(Key = "authorization", Authorization = paste("Bearer", accessToken, sep = " ")),
     body = list(Item = "ItemCode", PurchaseOrderId = "999999", QuantityInPurchaseUnits = "1.0"),
     encode = "json")

Для фактического запроса PurchaseOrder, пока у меня есть это:

POST(url = paste("https://start.exactonline.nl/api/v1/", division, "/purchaseorder/PurchaseOrders", sep = ""),
     add_headers(Key = "authorization", Authorization = paste("Bearer", accessToken, sep = " ")),
     body = list(Supplier = "SupplierName", PurchaseOrderID = "999999"), encode = "json") 

Как указано в документации: «Строки заказа на поставку не могут быть разнесены по отдельности. Они должны быть частью PostErder Post."

Таким образом, вопрос заключается в следующем: как сделать строки заказа на поставку частью Почты на покупку.

1 Ответ

0 голосов
/ 08 декабря 2018

Как правило, в Exact Online вы можете объединять несколько запросов с помощью пакетной обработки OData.Это работает только тогда, когда трафик идет к одной конечной точке (URL).

Однако ваш вопрос более функциональный по своей природе.Точное требует, чтобы каждая транзакция имела хотя бы одну строку (я знаю, что это глупо, но жить с этим).Это относится как к пользовательскому интерфейсу, так и к API, которые отражают это бизнес-правило.

В вашем событии создания PurchaseOrder необходимо отправить строки вместе с частью сообщения.

Пожалуйста, отметьте https://start.exactonline.nl/docs/HlpRestAPIResourcesDetails.aspx?name=PurchaseOrderPurchaseOrders и ищите «Коллекция» в тексте.

Там необходимо вставить строки (как минимум 1).

Если вы не указали точный синтаксис, пожалуйста,используйте insert into exactonlinerest..purchaseorders ... identified by ... в Invantive SQL, а затем запустите его.В select * from sessionios@datadictionary вы найдете фактический звонок.Когда вы включаете собственную трассировку, вы можете видеть полезную нагрузку, отправляемую в Exact Online, в виде трассировки отладки.

В качестве примечания, для загрузки данных я обычно предпочитаю использовать XML API.Это быстрее и умнее.

Запуск образца

Запустите dbgview.Включите ведение журнала трассировки, используя INVANTIVE_TRACE_ACTIVE = истинная переменная среды.Запустите инвентивный контроль или другой продукт sql.Запустите этот код, чтобы создать дубликат каждого заказа клиента в новом:

set trace-native-calls true

begin transaction

insert into exactonlinerest..salesorders
( description
, orderedby
, deliverto
, deliveryaddress
, invoiceto
)
select 'EDI order '
       || ' van '
       || to_char(sysdate, 'DD-MM-YYYY')
       description
,      sor.orderedby
       label 'Ordered by account ID'
,      sor.deliverto
       label 'Deliver to account ID'
,      sor.deliveryaddress
       label 'Deliver to address ID'
,      sor.invoiceto
       label 'Invoice to account ID'
from   ( select orderid, orderedby, invoiceto, deliverto, deliveryaddress  from exactonlinerest..salesorders ) sor
identified
by     sor.orderid

insert into exactonlinerest..salesorderlines
( description
, item
, quantity
, unitcode
)
select sle.description
,      sle.item
,      sle.quantity
,      sle.unitcode
from   exactonlinerest..salesorderlines sle
attach
to     sle.orderid

commit 

Результат: Sales order

Собственный след:

[49784] 15:02:21.82979-45: POST 962 bytes of data to URL '/api/v1/868047/salesorder/SalesOrders'. Disk cache: False/False, memory cache False/False. 
[49784] 15:02:21.82979-45: Native request body on POST to 'https://start.exactonline.nl/api/v1/868047/salesorder/SalesOrders': 
[49784] 15:02:21.82979-45: {"DeliverTo":"3ee8cdbc-e71c-4e8b-b4ee-922e84b05abf","DeliveryAddress":"fa6f3eb2-ba09-4c9f-aeb0-c967bdd8004f","Description":"EDI order  van 08-12-2018","InvoiceTo":"3ee8cdbc-e71c-4e8b-b4ee-922e84b05abf","OrderedBy":"3ee8cdbc-e71c-4e8b-b4ee-922e84b05abf","SalesOrderLines":[{"Description":"Basebal handschoen links","Item":"ee4d1e32-4296-4460-908c-d109b9c2ac77","Quantity":25.0,"UnitCode":"stuk"},{"Description":"Basebal handschoen rechts","Item":"8ee41235-7688-4201-a142-ba56feb393c6","Quantity":10.0,"UnitCode":"stuk"},{"Description":"Basebal","Item":"1f61a71a-4503-407f-8b32-0f63f51a1dae","Quantity":50.0,"UnitCode":"stuk"},{"Description":"Energydrink","Item":"2d37742d-1101-49c6-8c09-59055a808415","Quantity":150.0,"UnitCode":"stuk"},{"Description":"Basebal knuppel","Item":"858cbee5-f597-4333-8679-4083c896cf9f","Quantity":30.0,"UnitCode":"stuk"},{"Description":"Energy reep","Item":"1cb1c87c-2dc4-4be9-8be6-54347403680d","Quantity":100.0,"UnitCode":"stuk"}]} 
[49784] 15:02:21.89579-3: Response status 'OK', length 226. 

и многие другие сообщения.

...