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
相关产品推荐
相关产品推荐

