MS Dynamics 365 Business Central。API POST、PATCH、DELETE不起作用。

7

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

任务

问题

GET

请求:

响应:

{
    "@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"
        },

删除

{
    "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."
    }
}

我无法为客户、产品项应用CUD操作,但对于订单可以。

现有权限

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

在权限部分,有太多的授权权限,其中包括超级特权项。据我所知,所有名称都是自定义的。这是已分配权限的截图。

enter image description here

更新 1.

我尝试遵循此指南:https://learn.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:

enter image description here

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

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

enter image description here

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

在此部分中没有任何内容,我添加了新密钥。现在看起来像这样。 但在我的情况下没有改变任何东西。 端口7057的错误仍然是405,端口7058的错误仍然是404。

enter image description here

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

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

这个页面是否在此托管?

enter image description here

以下是响应示例:

enter image description here enter image description here

执行后,URL更改为正确的供应商名称。

由于我正在度假,无法立即测试所有内容。 感谢大家的时间

3个回答

3

OData终端点与API终端点不同。

建议使用API,因为这是与Business Central内数据交互的更现代和高效的方式。

API终端点的文档可以在此处找到:https://learn.microsoft.com/en-us/dynamics-nav/api-reference/v1.0/,其中包括一些示例,例如更新客户、项目等。

您可以使用OData修改数据,但前提是驱动终端点的基础对象必须是页面(而不是查询),并且必须标记为InsertAllowed。这比API终端点不太优化。

https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/webservices/use-odata-to-modify-data

我更新了一篇文章(upd1部分),你能看一下吗? - zhartaunik

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),并且您必须在标头中提供带有odata.etag值的If-Match


2
参数如下:
  1. 基础URL: 服务器名称,例如d365bc.vendor.com
  2. 端口:用于OData的端口,例如7058
  3. 服务器实例:Business Central服务器实例的名称,例如attain
  4. API发布者:用于分组自定义API(使用标准API时不需要)
  5. API组:用于分组自定义API(使用标准API时不需要)
  6. API版本:用于分组自定义API(使用标准API时不需要)
可以在OData服务下的“Business Central服务层设置”的OData基础URL字段中找到基础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,只需在请求正文中提供所需的数据即可。 要求:
  1. 必须在Business Central服务器实例上启用API
  2. 用于身份验证的用户必须具有Web服务访问密钥(在Business Central中为用户创建)
  3. 用户必须在Business Central中具有相关API所需的权限。
注释:
  • 某些API仅支持GET。这意味着您会收到405不允许错误的POST或PATCH。
  • 对于PATCH操作,您可能需要在请求标头中添加If-Match *。
回复UPD.2:
  • 端口7057和https://d365bc.vendor.com:7057/Attain/WS/用于SOAP Web服务,不应与API混淆。您需要根据OData Services选项卡中指定的方式使用端口7058。

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


我已经添加了一个关于需求的章节。 - kaspermoerch
请查看Upd.2部分。 - zhartaunik
https://d365bc.vendor.com:7058/attain/api/v1.0 返回404。 - zhartaunik
抱歉,我正在度假... 13.0.24623.0 - zhartaunik
好的,那么您需要将URL中的v1.0替换为beta。从版本14开始才能使用v1.0 - kaspermoerch
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接