Dynamics 365 API v2:将销售行添加到现有销售订单

问题描述 投票:0回答:2

我正在尝试使用 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。"}}"

我可以使用深度请求同时发布销售订单及其行,但对于较大的订单,它们会达到请求限制,我需要一种拆分行的方法。

web-services odata dynamics-365 dynamics-business-central
2个回答
0
投票

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
            }
        }
    ]
}

0
投票

下面是一个 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);
© www.soinside.com 2019 - 2024. All rights reserved.