使用OData4调用Dynamics Business Central代码单元时按引用传参问题
解决Dynamics Business Central OData4调用带引用参数代码单元的问题
核心问题原因
你之前用的codeunit_functionName格式仅适用于无输出/引用参数的代码单元函数。带by reference(Out/InOut)参数的函数必须使用BC OData专门的Invoke端点,否则会触发“Resource not found”错误。
正确调用步骤
调整请求URL
使用固定的Invoke端点格式,替换为你的代码单元名称/ID和公司ID:https://<你的BC实例域名>/api/v2.0/companies({公司ID})/codeunit('<代码单元名称或ID>')/Microsoft.Dynamics.Nav.Invoke构造正确的请求体JSON
需要在请求体中明确指定函数名、参数,以及引用参数的类型和传递方向:{ "functionName": "<你的函数名>", "parameters": { // 普通输入参数直接传值 "普通输入参数名": "参数值", // 引用参数需要添加两个特殊标识 "引用参数名@odata.type": "#Edm.<对应类型>", "引用参数名@Microsoft.Dynamics.Nav.InvokeAsType": "Out" // 或"InOut" } }- 类型映射:BC的
Text对应#Edm.String,Integer对应#Edm.Int32,Decimal对应#Edm.Decimal,以此类推。 - 方向标识:
Out表示仅输出,InOut表示输入输出双向。
- 类型映射:BC的
请求头配置
保持POST方法,必须携带以下请求头:Content-Type: application/json- 授权头(如
Authorization: Bearer <你的访问令牌>)
示例场景
假设你有一个名为CustomerProcessor的代码单元,函数GetCustomerDetails包含:
- 输入参数:
CustomerNo(Text类型) - 输出参数:
CustomerName(Text类型,by reference)
对应的请求:
- URL:
https://bc-demo.com/api/v2.0/companies(12345678-1234-1234-1234-1234567890ab)/codeunit('CustomerProcessor')/Microsoft.Dynamics.Nav.Invoke - 请求体:
{ "functionName": "GetCustomerDetails", "parameters": { "CustomerNo": "C0001", "CustomerName@odata.type": "#Edm.String", "CustomerName@Microsoft.Dynamics.Nav.InvokeAsType": "Out" } }
额外排查点
- 确认代码单元已在BC的Web服务中发布,且OData服务状态为“已发布”。
- 参数名称严格匹配BC函数中的定义(区分大小写)。
- 检查BC实例的OData版本是否为v2.0或更高(v1.0不支持该Invoke端点)。
内容的提问来源于stack exchange,提问作者user11889334
相关产品推荐
相关产品推荐

