Business Central自定义API页面:关联插入触发器及解决401认证问题
问题分析与解决方案
你目前遇到两个核心问题:一是自定义API页面插入记录后无数据返回且触发器逻辑未生效,二是Postman调用时出现401认证错误。下面分别给出针对性的修复方案:
一、修复API页面的插入逻辑与触发器关联问题
先看你代码里的几个关键错误:
DelayedInsert = true配置下,API框架会自动处理插入流程,你手动调用Insert(true)会干扰这个机制,导致记录插入异常。readInvoice()和updateInvoice()里的currentInvoice是全新的空记录实例,根本没有关联到当前正在插入的那条数据,所以既读不到值,更新操作也不会生效。- 布局里的字段拼写错误(
Sell-to Adress→Sell-to Address),可能导致字段映射失败。
修改后的完整代码
page 50105 "Custom Invoice API" { PageType = API; Caption = 'Custom Sales Invoice Header API'; APIPublisher = 'xy'; APIVersion = 'beta'; APIGroup = 'customsalesinvoiceheader'; EntityName = 'salesInvoiceHeader'; EntitySetName = 'salesInvoiceHeaders'; SourceTable = "Sales Invoice Header"; DelayedInsert = true; layout { area(Content) { repeater(GroupName) { field(id; "No.") { Caption = 'No.'; } field(name; "Sell-to Customer Name") { Caption = 'Customer Name'; } field(address; "Sell-to Address") { Caption = 'Sell-to Address'; } field(shipdate; "Shipment Date") { Caption = 'Shipment Date'; } } } } trigger OnInsertRecord(BelowxRec: Boolean): Boolean begin // 无需手动调用Insert,API框架会自动处理插入流程 // 直接使用Rec变量访问当前待插入的记录 Message(readInvoice(Rec)); updateInvoice(Rec); exit(true); end; procedure readInvoice(invoice: Record "Sales Invoice Header"): Text begin exit(invoice."No." + ' ' + invoice."Sell-to Customer Name" + ' ' + invoice."Sell-to Address" + ' ' + Format(invoice."Shipment Date")); end; procedure updateInvoice(var invoice: Record "Sales Invoice Header") begin invoice."Shipment Date" := DMY2Date(19, 6, 2020); // 触发器中修改Rec变量后,API会自动将变更保存到数据库,无需额外调用Update end; }
关键修改说明
- 移除了手动
Insert(true)调用,让API框架按DelayedInsert的规则处理插入。 - 将
readInvoice和updateInvoice改为接收当前记录作为参数(updateInvoice用var传递,确保修改作用到原记录),避免创建空记录实例。 - 修正了字段拼写错误,保证字段映射正常。
- 触发器中直接操作
Rec变量,修改后API会自动保存变更,插入成功后会返回更新后的记录数据,解决页面为空的问题。
二、解决Postman 401认证错误问题
你错误地创建了查询类型Web服务,但实际需要发布的是自定义API页面,具体步骤如下:
1. 正确发布自定义API页面为Web服务
- 在Business Central中搜索Web Services页面。
- 点击新建,在
对象类型选择页面,对象ID填写50105(你的自定义API页面ID),服务名称可设为customSalesInvoiceHeaderAPI,勾选已发布。 - 保存后复制生成的OData V4 URL(格式类似
https://<你的BC环境地址>/ODataV4/xy/beta/customsalesinvoiceheader/salesInvoiceHeaders),这是Postman要调用的目标地址。
2. 配置正确的认证方式
方式一:基本认证
- 确认你的BC环境允许基本认证:云环境需要在Azure AD中配置允许用户名/密码登录,本地环境需在管理控制台开启相关设置。
- Postman中选择
Basic Auth认证,填写管理员的完整BC用户名(云环境为邮箱格式,如user@tenant.onmicrosoft.com)和密码。
方式二:Web Service访问密钥
- 在BC的用户页面找到目标用户,点击
Web Service访问密钥→生成新密钥,复制生成的密钥。 - Postman中在请求头添加
Authorization: Basic <base64编码的用户名:密钥>,或直接用Basic Auth,用户名填用户邮箱,密码填生成的访问密钥。
3. 权限检查
确保你的用户拥有:
Sales Invoice Header表的读写权限;- 自定义API页面(ID50105)的访问权限;
- 可通过分配
Sales Manager权限集,或创建自定义权限集包含上述权限。
测试调用示例
在Postman中发送POST请求到复制的OData URL,Body选择raw→JSON,填入测试数据:
{ "No": "TEST001", "Sell-to Customer Name": "Test Customer", "Sell-to Address": "123 Test St", "Shipment Date": "2024-01-01" }
发送后应收到201 Created响应,返回更新后的记录(Shipment Date会被修改为2020-06-19),同时BC客户端会弹出你设置的消息。
内容的提问来源于stack exchange,提问作者Jure Fadiga
相关产品推荐
相关产品推荐

