You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Business Central自定义API页面:关联插入触发器及解决401认证问题

问题分析与解决方案

你目前遇到两个核心问题:一是自定义API页面插入记录后无数据返回且触发器逻辑未生效,二是Postman调用时出现401认证错误。下面分别给出针对性的修复方案:


一、修复API页面的插入逻辑与触发器关联问题

先看你代码里的几个关键错误:

  1. DelayedInsert = true 配置下,API框架会自动处理插入流程,你手动调用 Insert(true) 会干扰这个机制,导致记录插入异常。
  2. readInvoice() 和 updateInvoice() 里的 currentInvoice 是全新的空记录实例,根本没有关联到当前正在插入的那条数据,所以既读不到值,更新操作也不会生效。
  3. 布局里的字段拼写错误(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:37:56