7

我们已经在我们的服务器上安装了 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."
    }
}

我不确定 Create (POST) 或 Update (Patch) 的正确语法是什么 对于 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."
    }
}

我无法为客户 ProductItems 应用 CUD 操作。但是对于订单,它可以工作。

现有特权

如果我跟随

设置和扩展 / 手动设置 / 用户 / [选择用户]

在权限部分,分配的权限太多。其中,有一个SUPER特权项。据我所知,所有的名字都是定制的。这是分配权限的屏幕截图。

在此处输入图像描述

UPD 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

关于要求:

必须在 Business Central 服务器实例上启用 API:

在此处输入图像描述

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

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

在此处输入图像描述

用于身份验证的用户必须具有 Web 服务访问密钥(在 Business Central 中为用户创建)

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

在此处输入图像描述

ps 简单生成就够了吗?或者我们需要在某个地方使用它?

用户必须在 Business Central 中拥有相关 API 所需的权限。

是在下一页管理吗?

在此处输入图像描述

以下是响应示例:

在此处输入图像描述 在此处输入图像描述

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

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

4

3 回答 3

3

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

于 2020-11-16T00:04:01.413 回答
2

参数如下:

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

基本 URL、端口和服务器实例的组合可以位于 OData 服务和业务中心服务层设置上的字段 OData Base 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

通过在请求正文中以 json 格式提供所需的数据,您可以为 POST 或 PATCH 使用相同的端点。

要求:

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

注释:

  • 一些 API 只支持 GET。这意味着您将收到 POST 或 PATCH 的 405 Not allowed 错误。
  • 您可能需要将 If-Match * 添加到 PATCH 操作的请求标头中。

对 UPD.2 的回应:

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

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

于 2020-11-17T10:53:46.823 回答
2

一些注意事项:

  1. 您需要先检索实体(通过“获取”),然后当您需要更新/PUT 或删除时(除了需要使用正确的方法(PUT、DELETE))您必须发送 API 调用的标头,参数: 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),并且您必须在标头中提供 If-Match,其值为 odata.etag

于 2020-11-23T12:21:55.090 回答