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

求助:使用Delphi向REST API发送带XML文件的POST请求

Delphi实现multipart/form-data POST请求(对应curl上传XML场景)

针对你给出的curl命令,下面是两种常用Delphi组件的正确实现方式,可解决文件上传时提示“文件无效”的问题:

一、使用TIdHTTP实现

需引用IdHTTP、IdMultipartFormData、IdURI单元:

uses
  IdHTTP, IdMultipartFormData, IdURI, SysUtils;

procedure PostXMLFileWithIdHTTP;
var
  IdHTTP: TIdHTTP;
  FormData: TIdMultiPartFormDataStream;
  Response: string;
begin
  IdHTTP := TIdHTTP.Create(nil);
  FormData := TIdMultiPartFormDataStream.Create;
  try
    // 设置Accept请求头,对应curl的-H 'accept: application/json'
    IdHTTP.Request.Accept := 'application/json';
    
    // 添加文件字段:字段名严格匹配curl中的`xml`,指定文件路径与Content-Type
    FormData.AddFile('xml', 'semilla.xml', 'text/xml');
    
    // 发送POST请求
    Response := IdHTTP.Post('https://ecf.dgii.gov...ValidarSemilla', FormData);
    
    // 处理响应(示例为弹窗展示,可根据需求解析JSON)
    ShowMessage('响应:' + Response);
  finally
    FormData.Free;
    IdHTTP.Free;
  end;
end;

注意事项:

  • 不要手动设置Content-Type为multipart/form-data,TIdMultiPartFormDataStream会自动生成带边界标识的正确请求头,手动设置会覆盖边界信息导致服务端解析失败。
  • 确保文件路径正确,若文件不在程序当前目录,需填写绝对路径。
  • 字段名xml需与curl命令中的字段名完全一致,大小写敏感。

二、使用THTTPClient实现(Delphi 10.2+版本支持)

需引用System.Net.HttpClient、System.Net.URLClient、System.Classes单元:

uses
  System.Net.HttpClient, System.Net.URLClient, System.Classes, SysUtils;

procedure PostXMLFileWithTHttpClient;
var
  HTTPClient: THTTPClient;
  FormData: TMultipartFormData;
  Response: IHTTPResponse;
  ResponseContent: string;
begin
  HTTPClient := THTTPClient.Create;
  FormData := TMultipartFormData.Create;
  try
    // 设置Accept请求头
    HTTPClient.CustomHeaders['accept'] := 'application/json';
    
    // 添加文件字段:匹配curl的字段名、文件路径与Content-Type
    FormData.AddFile('xml', 'semilla.xml', 'text/xml');
    
    // 解决HTTPS证书/TLS版本兼容问题(按需添加)
    HTTPClient.SSLOptions.SSLVersions := [TSSLVersion.TLS1_2];
    
    // 发送POST请求
    Response := HTTPClient.Post('https://ecf.dgii.gov...ValidarSemilla', FormData);
    ResponseContent := Response.ContentAsString;
    
    // 处理响应
    ShowMessage('响应:' + ResponseContent);
  finally
    FormData.Free;
    HTTPClient.Free;
  end;
end;

注意事项:

  • THTTPClient会自动处理multipart请求的边界与Content-Type,无需手动配置。
  • 若遇到HTTPS连接失败,需指定正确的TLS版本(如示例中的TLS1.2),部分旧Delphi版本默认未启用高版本TLS。

常见错误原因排查

  • 字段名与服务端要求不一致(如写成XML而非xml)
  • 手动设置错误的Content-Type,缺失边界标识
  • 文件路径错误或无读取权限,导致文件未正确上传
  • 未指定text/xml的Content-Type,服务端无法识别文件类型
  • TLS版本不兼容,导致请求被拦截或数据传输异常

内容的提问来源于stack exchange,提问作者brahian pena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:55:36