Delphi中用Indy上传XML有三种方式:一、TIdHTTP直接Post字符串,设ContentType为application/xml;二、用TStringStream封装UTF-8编码XML流上传;三、用TIdMultipartFormDataStream模拟表单上传文件。均需异常处理与响应解析。

如果您需要在Delphi应用程序中通过Indy组件实现XML文件上传功能,则需借助TIdHTTP完成HTTP POST请求,并将XML内容作为请求体或表单字段发送至指定服务器端点。以下是具体实施步骤:
一、使用TIdHTTP以字符串形式上传XML内容
该方法适用于服务器端接受纯文本/XML格式的POST请求,将XML内容直接写入请求体,无需编码为multipart/form-data。此方式简洁高效,适合轻量级接口调用。
1、在Delphi项目中添加IdHTTP、IdSSL、IdSSLOpenSSL单元引用。
2、声明并创建TIdHTTP实例,启用SSL支持(如目标URL为HTTPS):
IdHTTP1 := TIdHTTP.Create(nil); IdHTTP1.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
3、设置请求头Content-Type为application/xml:
IdHTTP1.Request.ContentType := 'application/xml';
4、准备XML字符串内容,例如:S := '
5、调用Post方法,传入URL与XML字符串:
Response := IdHTTP1.Post('https://api.example.com/upload', S);
二、使用TIdHTTP以TStringStream封装上传XML
该方法通过TStringStream包装XML字符串,避免因字符编码问题导致的乱码,尤其适用于含中文或UTF-8 BOM的XML内容,确保服务端正确解析原始字节流。
1、创建TStringStream实例,指定XML字符串及TEncoding.UTF8:
XMLStream := TStringStream.Create(S, TEncoding.UTF8);
2、设置IdHTTP的Request.ContentEncoding为'utf-8':
IdHTTP1.Request.ContentEncoding := 'utf-8';
3、保持ContentType为application/xml:
IdHTTP1.Request.ContentType := 'application/xml';
4、调用Post并传入TStringStream对象:
Response := IdHTTP1.Post('https://api.example.com/upload', XMLStream);
5、释放流对象:
XMLStream.Free;
三、使用TIdMultipartFormDataStream上传XML文件(含文件名与边界)
该方法模拟浏览器表单提交,将XML作为文件字段上传,适用于要求multipart/form-data格式的API,例如接收file字段的后端接口。
1、创建TIdMultipartFormDataStream实例:
FormData := TIdMultipartFormDataStream.Create;
2、调用AddFile方法,指定字段名、本地XML文件路径及MIME类型:
FormData.AddFile('xml_file', 'C:\data.xml', 'application/xml');
3、设置IdHTTP的ContentType自动适配multipart边界:
IdHTTP1.Request.ContentType := FormData.RequestContentType;
4、执行Post请求,传入URL与FormData流:
Response := IdHTTP1.Post('https://api.example.com/upload', FormData);
5、释放FormData对象:
FormData.Free;
四、处理服务器响应与异常
无论采用哪种上传方式,都必须捕获TIdHTTP引发的网络异常,以便区分连接失败、超时、认证错误或服务端返回的非2xx状态码。
1、将Post调用包裹在try-except块中:
try Response := IdHTTP1.Post(URL, Data); except on E: EIdHTTPProtocolException do begin StatusCode := E.ErrorCode; ErrorMsg := E.ErrorMessage; end; on E: Exception do begin ErrorMsg := E.Message; end; end;
2、检查响应状态码是否为200:
if IdHTTP1.ResponseCode = 200 then Success := True else Success := False;
3、读取响应正文用于进一步解析:
ResponseBody := IdHTTP1.Response.Text;










