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

Dynamics BC AL中正斜杠/编码问题:调用外部API返回404

问题描述

我通过HttpClient调用外部API,源代码如下:

usercontrol(html; HTML)
{
    ApplicationArea = all;

    trigger ControlReady()
    Var
        JSONManagement: Codeunit "JSON Management";
        "HttpClient": HttpClient;
        HttpContent: HttpContent;
        HttpMessage: HttpRequestMessage;
        HttpRespnse: HttpResponseMessage;
        JsonText: Text;
        ResponseMessage: Text;
        cnew: text;
        TypeHelper: Codeunit "Type Helper";

    begin
        NR := 'SEDC470R/3841D';
        IF NR = '' THEN begin
        end
        ELSE begin


            HttpMessage.SetRequestUri('https://.........r.avd.dk/api/97d267826-2dc0/items/' + TypeHelper.UrlEncode(NR) + '/listDummyall?pc=Ja');
            HttpClient.Send(HttpMessage, HttpRespnse);
            HttpContent := HttpRespnse.Content();
            HttpContent.ReadAs(ResponseMessage);
            CurrPage.html.Render(ResponseMessage);
        end;
    end;
}

调用后返回404 Not Found页面,看起来正斜杠未被正确编码,请问我还遗漏了哪些步骤?

解决方案
  • 确认UrlEncode的编码逻辑:Dynamics 365 Business Central的Type Helper代码单元中,UrlEncode默认不会编码URL路径分隔符/,但你的场景中/是参数的一部分而非路径分隔符,需要手动将NR中的/替换为%2F,或者使用自定义编码逻辑对参数进行全字符编码。
  • 拆分路径段构建URL:不要直接拼接编码后的参数到路径中,改用HttpRequestMessage.AddPathSegment方法添加参数,这个方法会自动处理路径段内的特殊字符,避免与URL原生的路径分隔符冲突。
  • 验证最终请求URL:在发送请求前,通过HttpMessage.RequestUri().ToString()输出完整请求地址,确认SEDC470R/3841D是否被转为SEDC470R%2F3841D,而非保留原始/导致路径被错误拆分。
  • 检查API路径规则:部分API会严格识别路径中的分隔符,即使编码后的%2F也可能不被当作参数的一部分,这种情况下需要确认API是否支持将该参数放在查询字符串中传递。
  • 完善错误处理逻辑:当前代码未处理HTTP错误状态,建议添加判断:如果HttpRespnse.IsSuccessStatusCode()为false,输出HttpRespnse.StatusCode()和HttpRespnse.ReasonPhrase(),获取更精准的错误信息,确认404是否真的由编码问题导致。

内容的提问来源于stack exchange,提问作者Aziz Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:45:41