MS Dynamics 365 商业中心。 API POST, PATCH, DELETE 不起作用

MS Dynamics 365 Business Central. API POST, PATCH, DELETE does not work

我们的服务器上安装了MS Dynamics 365 Business Central(我不知道如何查看当前安装的版本)。我们正在为我们的请求使用 oData v4 协议。

任务

我们需要从 PHP 调用此系统 API

问题

当 GET 请求正常工作时,不可能发出 POST、PATCH、DELETE 请求。

得到

要求:

获取 https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer

回应

{
    "@odata.context": "https://d365bc.vendor.com:7058/attain/ODataV4/$metadata#Company('...')/Customer",
    "value": [
        {
            "@odata.etag": "W/\"JzQ0O29EcmJmcGs4V3NRMHlEQ0Fxa0JxL1N0bi9xZjY5UDFQakZ0U2tBUGU1Kzg9MTswMDsn\"",
            "No": "01121212",
            "Name": "Spotsmeyer's Furnishings",
            "Responsibility_Center": "",
            "Location_Code": "YELLOW",
            "Post_Code": "US-FL 37125",
            "Country_Region_Code": "US",
            "Phone_No": "",
            "IC_Partner_Code": "",
            "Contact": "Mr. Mike Nash",
            "Salesperson_Code": "JR",
            "Customer_Posting_Group": "FOREIGN",
            "Gen_Bus_Posting_Group": "EXPORT",
            "VAT_Bus_Posting_Group": "EXPORT",
            "Customer_Price_Group": "",
            "Customer_Disc_Group": "",
            "Payment_Terms_Code": "1M(8D)",
            "Reminder_Terms_Code": "FOREIGN",
            "Fin_Charge_Terms_Code": "2.0 FOR.",
            "Currency_Code": "USD",
            "Language_Code": "ENU",
            "Search_Name": "SPOTSMEYER'S FURNISHINGS",
            "Credit_Limit_LCY": 0,
            "Blocked": " ",
            "Privacy_Blocked": false,
            "Last_Date_Modified": "2020-06-18",
            "Application_Method": "Manual",
            "Combine_Shipments": true,
            "Reserve": "Optional",
            "Shipping_Advice": "Partial",
            "Shipping_Agent_Code": "",
            "Base_Calendar_Code": "",
            "Balance_LCY": 0,
            "Balance_Due_LCY": 0,
            "Sales_LCY": 0,
            "Global_Dimension_1_Filter": "",
            "Global_Dimension_2_Filter": "",
            "Currency_Filter": "",
            "Date_Filter": "..11/13/20"
        },
        {
            "@odata.etag": "W/\"JzQ0O08vNlVHSWVaZ1FGeG42d2JOa3k4Qm5uVHlkSGYzNk1ES2V5Y2E2S3hiekU9MTswMDsn\"",
            "No": "01445544",
            "Name": "Progressive Home Furnishings",
            "Responsibility_Center": "",
            "Location_Code": "YELLOW",
            "Post_Code": "US-IL 61236",
            "Country_Region_Code": "US",
            "Phone_No": "",
            "IC_Partner_Code": "",
            "Contact": "Mr. Scott Mitchell",
            "Salesperson_Code": "JR",
            "Customer_Posting_Group": "FOREIGN",
            "Gen_Bus_Posting_Group": "EXPORT",
            "VAT_Bus_Posting_Group": "EXPORT",
            "Customer_Price_Group": "",
            "Customer_Disc_Group": "RETAIL",
            "Payment_Terms_Code": "14 DAYS",
            "Reminder_Terms_Code": "FOREIGN",
            "Fin_Charge_Terms_Code": "2.0 FOR.",
            "Currency_Code": "USD",
            "Language_Code": "ENU",
            "Search_Name": "PROGRESSIVE HOME FURNISHINGS",
            "Credit_Limit_LCY": 0,
            "Blocked": " ",
            "Privacy_Blocked": false,
            "Last_Date_Modified": "2018-09-19",
            "Application_Method": "Manual",
            "Combine_Shipments": true,
            "Reserve": "Optional",
            "Shipping_Advice": "Partial",
            "Shipping_Agent_Code": "",
            "Base_Calendar_Code": "",
            "Balance_LCY": 1499.03,
            "Balance_Due_LCY": 1499.03,
            "Sales_LCY": 1499.03,
            "Global_Dimension_1_Filter": "",
            "Global_Dimension_2_Filter": "",
            "Currency_Filter": "",
            "Date_Filter": "..11/13/20"
        },

删除

删除 https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer(No='01121212')
{
    "error": {
        "code": "BadRequest",
        "message": "Entity does not support delete."
    }
}

我不确定创建 (POST) 或更新(补丁)的正确语法是什么 对于 POST 请求,我尝试复制现有值(从 GET 中获取)并将其放入正文中。我收到以下回复:

{
    "error": {
        "code": "BadRequest_MethodNotAllowed",
        "message": "Entity does not support insert."
    }
}

有时,如果我提出完全错误的请求,我会收到以下回复:

{
    "error": {
        "code": "BadRequest_MethodNotAllowed",
        "message": "'POST' requests for 'Customer' of EdmType 'Entity' are not allowed within Microsoft Dynamics 365 Business Central OData web services."
    }
}

我无法为 Customers、ProductItems 应用 CUD 操作。但是对于订单它有效。

现有特权

如果我跟着

Setup & Extensions / Manual Setup / Users / [Select User]

在权限部分,分配的权限过多。其中,有一个SUPER特权项目。据我所知,那里所有的名字都是习惯的。这是分配权限的屏幕截图。

更新 1.

我试着遵循这个指南:https://docs.microsoft.com/en-us/dynamics-nav/api-reference/v1.0/

我有本地安装,对我来说不清楚任何操作的正确端点是什么。

例如我可以提出以下要求:

https://d365bc.vendor.com:7057/attain/WS/CRONUS%20International%20Ltd/Page/Customer

因此,我得到了一些计划,但不是客户,也没有可能与他们一起采取任何行动。

据我了解,本指南仅包含云安装示例。

Extension APIs:
https://<base URL>:<port>/<serverinstance>/api/<API publisher>/<API group>/<API version>

我做的一切都正确吗?这些参数是什么意思?指南中没有提供解释。

更新 2

关于要求:

API must be enabled on the Business Central server instance:

所以端口是7057,API URL是https://d365bc.vendor.com:7057/Attain/WS/

什么是 WS,真的需要吗?通过上面的 URL 我得到这个:

The user used for authentication must have a Web Service Access Key (created for the user in Business Central)

这部分没有任何内容,我添加了新密钥。现在它看起来像这样。但它并没有改变我的情况。仍然是相同的错误:端口 7057 为 405,端口 7058 为 404。

p.s。仅仅生成它就足够了吗?或者我们需要在某个地方使用它?

The user must have the required permissions within Business Central for the relevant API's.

是否在下一页管理?

以下是响应示例:

Url 在域名中使用正确的供应商名称执行后已更改。

我现在无法测试所有内容,因为我离笔记本电脑很远。感谢大家的宝贵时间

OData 端点与 API 端点不同。

我建议使用 API,因为它是与 Business Central 中的数据进行交互的最新且高效的方式。

可在此处找到 API 端点的文档 https://docs.microsoft.com/en-us/dynamics-nav/api-reference/v1.0/,以及一些示例,例如更新客户、商品等

您可以使用 OData 修改数据,但前提是驱动端点的基础对象是页面(而不是查询),并且必须标记为 InsertAllowed。这不如 API 端点优化。 https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/use-odata-to-modify-data

参数如下:

  1. base URL: 服务器名称,例如d365bc.vendor.com
  2. port: 用于 OData 例如的端口7058
  3. serverinstance: Business Central 服务器实例的名称,例如达到
  4. API 发布者: 用于自定义 API 的分组(使用标准 API 时不需要)
  5. API组:用于自定义API的分组(使用标准API时不需要)
  6. API 版本: 用于自定义 API 的分组(使用标准 API 时不需要)

基础 URL、端口和服务器实例的组合可以位于 OData 服务和业务中心服务层设置中的字段 OData 基础 URL 下。

您需要使用的基本端点是(根据您提供的信息):

// Version 13
https://d365bc.vendor.com:7058/Attain/api/beta

// Version 14+
https://d365bc.vendor.com:7058/Attain/api/v1.0

要与 API 合作,您首先需要获得公司的 ID - 这样您就可以获得公司列表:

// Version 13
https://d365bc.vendor.com:7058/Attain/api/beta/companies

// Version 14+
https://d365bc.vendor.com:7058/Attain/api/v1.0/companies

使用您的公司 ID,您可以获得客户列表:

// Version 13
https://d365bc.vendor.com:7058/Attain/api/beta/companies([company id here!])/customers

// Version 14+
https://d365bc.vendor.com:7058/Attain/api/v1.0/companies([company id here!])/customers

您可以为 POST 或 PATCH 使用相同的端点,方法是在请求 body 中提供所需的数据作为 json。

要求:

  1. API 必须在 Business Central 服务器实例上启用
  2. 用于身份验证的用户必须具有 Web 服务访问密钥(在 Business Central 中为用户创建)
  3. 用户必须在 Business Central 中拥有相关 API 的所需权限。

评论:

  • 部分 API 仅支持 GET。这意味着您将收到 POST 或 PATCH.
  • 的 405 Not allowed 错误
  • 您可能需要将 If-Match * 添加到请求 headers 以进行 PATCH 操作。

对UPD.2的回复:

  • 端口 7057 和 https://d365bc.vendor.com:7057/Attain/WS/ 用于 SOAP Web 服务,不要与 API 混淆。您需要 OData 服务选项卡下所述的端口 7058。

  • 要分配 Web 服务访问密钥,您必须导航到 Business Central 中的用户,找到相关用户并单击按钮 Change Web Service Key

一些注意事项:

  1. 您需要先检索实体(通过 make 'Get'),然后当您需要执行 update/PUT 或删除时(除了需要使用正确的方法(PUT、DELETE )) 您必须在 API 调用的 Headers 中发送参数:If-Match 并使其等于 odata.etag 的值(您从 GET响应),它是这样的: If-Match: W/"JzQ0O0YxVTZnTlFpQ0NxbExDdmN0N2JGSDM2azN4dUhncEk1Nnl0MVhETGRIemc9MTswMDsn"

  2. 关于:https://d365bc.vendor.com:7058/attain/ODataV4/Company('{{company}}')/Customer(No='01121212') 这不是 OData:/Customer(No= 你应该使用 eq 而不是符号 = 但是,最好使用记录的 ID (GUID),您必须在 header 中提供 If-Match,值为 odata.etag