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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:40:15