我正在尝试使用 Dynamics 365 Business Central 附带的标准 API 将销售行添加到现有销售订单。但是我无法在 api 请求上找到正确的语法来完成此操作。
我已尝试发布到
companies({id})/salesOrderLines
端点和 companies({id})/salesOrder({id})/salesOrderLines
端点,但无论我如何尝试处理我的请求,我总是收到“无效请求正文”错误。
这是我发送到
companies({id})/salesOrderLines
端点的请求示例:
这是我的请求正文:
[
{
"id": "e92c39cb-f552-4d4f-b680-ad7ded2949d0",
"documentId": "e80573b0-9c8b-ed11-bfba-001dd8b71ee3",
"lineType": "Item",
"lineObjectNumber": "H10-110013",
"quantity": 1
},
{
"id": "e92c39cb-f552-4d4f-b680-ad7ded2949d0",
"documentId": "e80573b0-9c8b-ed11-bfba-001dd8b71ee3",
"lineType": "Item",
"lineObjectNumber": "H10-112117",
"quantity": 1
}
]
这是我得到的回复:
"{"error":{"code":"BadRequest","message":"无效请求 身体相关 ID:241e540a-5af5-4516-83f2-fbc035f80389。"}}"
我可以使用深度请求同时发布销售订单及其行,但对于较大的订单,它们会达到请求限制,我需要一种拆分行的方法。
salesOrderLines 端点需要一个对象并且不接受集合,因此您在这里可以做的最好的事情就是在单独的请求中发布每一行。 请求正文将如下所示:
{
"lineType": "Item",
"lineObjectNumber": "H10-110013",
"quantity": 1
}
id 和 documentId 可以添加到请求中,但不是真正必需的。
另一种选择是在 $batch 端点上发送请求,如此处文档中所述:https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/use-odata -批量
发布http://bc21-dev:7048/bc/api/v2.0/$batch
{
"requests": [
{
"method": "POST",
"url": "http://bc21-dev:7048/bc/api/v2.0/salesOrders(dd3585b3-dd6c-ed11-81b4-6045bd8e5172)/salesOrderLines",
"headers": {
"Company": "CRONUS International Ltd.",
"Content-Type": "application/json"
},
"body": {
"lineType": "Item",
"lineObjectNumber": "1920-S",
"quantity": 2,
"unitPrice": 420.4
}
},
{
"method": "POST",
"url": "http://bc21-dev:7048/bc/api/v2.0/salesOrders(dd3585b3-dd6c-ed11-81b4-6045bd8e5172)/salesOrderLines",
"headers": {
"Company": "CRONUS International Ltd.",
"Content-Type": "application/json"
},
"body": {
"lineType": "Item",
"lineObjectNumber": "1952-W",
"quantity": 1,
"unitPrice": 183.12
}
}
]
}
下面是一个 PHP 示例,尽管响应为空
$items = array();
$items[] = (object)array(
'part_no' => '{PRODUCT NAME - String}',
'product_quantity' => {PRODUCT QUANTITY - Integer}
);
$items[] = (object)array(
'part_no' => '{PRODUCT NAME - String}',
'product_quantity' => {PRODUCT QUANTITY - Integer}
);
$items[] = (object)array(
'part_no' => '{PRODUCT NAME - String}',
'product_quantity' => {PRODUCT QUANTITY - Integer}
);
$requests = array();
foreach($items as $item){
$requests[] = (object)array(
'method' => 'POST',
'url' => {DYNAMICS ODATA LINK}. '(\'{COMPANY NAME}\')/Sales_Order_Line',
'headers' => (object)array(
'Company' => '{COMPANY NAME}',
'Content-Type' => 'application/json',
'If-Match' => '*'
),
'body' => (object)array(
'Type' => 'Item',
'Document_No' => {SALES ORDER NUMBER},
'No' => $item->part_no,
'Quantity' => (int)$item->product_quantity
)
);
}
$data = (object)array(
'requests' => $requests
);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => {DYNAMICS ODATA BASE URI}. '/$batch',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => array(
'Authorization: Basic ' .base64_encode(USERNAME. ':' .PASSWORD). '',
'Content-Type: application/json'
),
));
$response = json_decode(curl_exec($curl));
$error = curl_error($curl);
curl_close($curl);