如何在Business Central(C/AL)中用curl收发外部URL数据及替代方案
在Business Central C/AL中实现HTTP请求(curl及替代方案)
一、使用curl工具实现请求
C/AL本身没有直接调用curl的原生API,需通过执行系统命令的方式调用curl,借助DotNet的System.Diagnostics.Process类执行命令并捕获输出结果。
1. GET请求示例
LOCAL PROCEDURE SendGetRequest(URL: Text): Text VAR Process: DotNet System.Diagnostics.Process; ProcessStartInfo: DotNet System.Diagnostics.ProcessStartInfo; Output: Text; BEGIN ProcessStartInfo := ProcessStartInfo.ProcessStartInfo(); ProcessStartInfo.FileName := 'curl.exe'; ProcessStartInfo.Arguments := '-s "' + URL + '"'; // -s 启用静默模式,不显示进度条 ProcessStartInfo.RedirectStandardOutput := TRUE; ProcessStartInfo.UseShellExecute := FALSE; ProcessStartInfo.CreateNoWindow := TRUE; Process := Process.Process(); Process.StartInfo := ProcessStartInfo; Process.Start(); Output := Process.StandardOutput.ReadToEnd(); Process.WaitForExit(); Process.Dispose(); EXIT(Output); END;
调用方式:
ResponseText := SendGetRequest('https://api.example.com/data'); MESSAGE(ResponseText);
2. POST请求示例(发送JSON数据)
LOCAL PROCEDURE SendPostRequest(URL: Text; JsonPayload: Text): Text VAR Process: DotNet System.Diagnostics.Process; ProcessStartInfo: DotNet System.Diagnostics.ProcessStartInfo; Output: Text; BEGIN ProcessStartInfo := ProcessStartInfo.ProcessStartInfo(); ProcessStartInfo.FileName := 'curl.exe'; ProcessStartInfo.Arguments := '-s -X POST -H "Content-Type: application/json" -d "' + JsonPayload + '" "' + URL + '"'; ProcessStartInfo.RedirectStandardOutput := TRUE; ProcessStartInfo.UseShellExecute := FALSE; ProcessStartInfo.CreateNoWindow := TRUE; Process := Process.Process(); Process.StartInfo := ProcessStartInfo; Process.Start(); Output := Process.StandardOutput.ReadToEnd(); Process.WaitForExit(); Process.Dispose(); EXIT(Output); END;
调用方式:
Json := '{"name":"Test","value":123}'; ResponseText := SendPostRequest('https://api.example.com/submit', Json); MESSAGE(ResponseText);
注意:需确保Business Central服务器上存在curl.exe,且服务运行账户具备执行权限。
二、替代实现方案
1. 使用C/AL内置HTTP客户端代码单元(推荐)
Business Central提供预定义代码单元HTTP Client Management(编号400),可直接发送HTTP请求,无需依赖外部工具,稳定性更强。
GET请求示例
LOCAL PROCEDURE SendGetRequestWithBuiltIn(URL: Text): Text VAR HttpClient: Codeunit "HTTP Client Management"; HttpResponse: Codeunit "HTTP Response Message"; ResponseContent: Text; BEGIN HttpClient.Get(URL, HttpResponse); IF HttpResponse.IsSuccessStatusCode() THEN HttpResponse.Content.ReadAs(ResponseContent); EXIT(ResponseContent); END;
POST请求示例(JSON数据)
LOCAL PROCEDURE SendPostRequestWithBuiltIn(URL: Text; JsonPayload: Text): Text VAR HttpClient: Codeunit "HTTP Client Management"; HttpRequest: Codeunit "HTTP Request Message"; HttpResponse: Codeunit "HTTP Response Message"; ResponseContent: Text; BEGIN HttpRequest.SetRequestUri(URL); HttpRequest.Method('POST'); HttpRequest.ContentType('application/json'); HttpRequest.Content.WriteFrom(JsonPayload); HttpClient.Send(HttpRequest, HttpResponse); IF HttpResponse.IsSuccessStatusCode() THEN HttpResponse.Content.ReadAs(ResponseContent); EXIT(ResponseContent); END;
2. 使用DotNet类直接发送请求
通过C/AL的DotNet集成,调用.NET原生的HttpWebRequest类实现HTTP请求。
POST请求示例
LOCAL PROCEDURE SendPostWithHttpWebRequest(URL: Text; JsonPayload: Text): Text VAR WebRequest: DotNet System.Net.HttpWebRequest; RequestStream: DotNet System.IO.Stream; StreamWriter: DotNet System.IO.StreamWriter; WebResponse: DotNet System.Net.WebResponse; ResponseStream: DotNet System.IO.Stream; StreamReader: DotNet System.IO.StreamReader; ResponseText: Text; BEGIN WebRequest := WebRequest.Create(URL) AS DotNet System.Net.HttpWebRequest; WebRequest.Method := 'POST'; WebRequest.ContentType := 'application/json'; WebRequest.ContentLength := STRLEN(JsonPayload); RequestStream := WebRequest.GetRequestStream(); StreamWriter := StreamWriter.StreamWriter(RequestStream); StreamWriter.Write(JsonPayload); StreamWriter.Close(); WebResponse := WebRequest.GetResponse(); ResponseStream := WebResponse.GetResponseStream(); StreamReader := StreamReader.StreamReader(ResponseStream); ResponseText := StreamReader.ReadToEnd(); StreamReader.Close(); WebResponse.Close(); EXIT(ResponseText); END;
注意事项
- 使用curl时,需处理URL或Payload中的特殊字符转义(比如引号),避免命令执行失败。
- 内置
HTTP Client Management代码单元已处理异常、编码等问题,是生产环境的优先选择。 - 所有HTTP请求需确保Business Central服务器能访问目标URL,需提前配置防火墙与网络权限。
内容的提问来源于stack exchange,提问作者Abiudeko
相关产品推荐
相关产品推荐

