delphi post请求怎么做?idhttp实例详解,Delphi中使用IDHTTP实例实现POST请求教程
Delphi写POST请求卡在参数传递?看这份IdHTTP实例代码直接抄作业!
明明照着教程敲代码,一运行就报错“参数无效”?——别慌!实测90%的坑藏在ContentType和流释放顺序里。分享三组开箱即用的IdHTTP代码块,连SSL证书避坑细节都给你标好了?
一、基础POST:5行代码搞定表单提交
delphi复制// 创建IdHTTP对象 var Http := TIdHTTP.Create(nil);tryHttp.Request.ContentType := 'application/x-www-form-urlencoded'; // 关键! // 直接拼参数(格式:参数1=值1&参数2=值2) Result := Http.Post('http://提交地址', 'username=test&password=123');finallyHttp.Free; // 用完必须释放! end;
避坑指南:
忘设ContentType → 服务器直接拒收数据;
参数带空格?用
TIdURI.ParamsEncode转义特殊符号。
二、参数传递:两种方式谁更香?
✅ List传参:适合键值对
delphi复制var Params := TStringList.Create;tryParams.Add('city=北京');Params.Add('temp=32℃');Http.Post('http://天气上报接口', Params);finallyParams.Free; // 别漏! end;
优点:不用手动拼&符号,防手 *** 党输错。
✅ 流传输:JSON/文件必选
delphi复制var JsonStream := TStringStream.Create('{"sensor":101,"value":0.87}');tryHttp.Request.ContentType := 'application/json'; // 改类型! Http.Post('http://数据接口', JsonStream);finallyJsonStream.Free; // 流释放顺序不能乱! end;
血泪教训:
没设JSON类型 → 后台解析失败;
先释放IdHTTP再释放流 → 程序直接崩!
三、HTTPS请求:证书报错怎么破?
delphi复制// 创建SSL处理对象 var SSL := TIdSSLIOHandler.OpenSSL.Create(nil);trySSL.SSLOptions.Method := sslvTLSv1_2;// 跳过证书验证(仅测试环境用!) SSL.SSLOptions.VerifyMode := []; // 生产环境删掉这行! Http.IOHandler := SSL;Http.Post('https://安全接口', 'data=test');finallySSL.Free;end;
致命细节:
没设SSLHandler → 连不上HTTPS;
VerifyMode留空 → 正式上线秒被黑?(正确方案:部署CA证书)。
不过话说回来……
为什么Delphi的SSL配置比Python复杂三倍?或许暗示Indy库该升级了?
四、代理和重定向:老板再也不用催进度
✅ 走代理服务器
delphi复制Http.ProxyParams.ProxyServer := '192.168.1.10';Http.ProxyParams.ProxyPort := 8080;Http.Post('http://外网接口', 'data');
✅ 自动跳转登录页
delphi复制Http.HandleRedirects := True; // 允许302跳转 Http.Request.CustomHeaders.Add('Cookie: sessionid=xxx'); // 带会话标识 Http.Post('http://需登录接口', Params);
实测场景:
HandleRedirects关闭 → 登录提交卡 *** ;
重定向超过10次?改
Http.RedirectMaximum参数!
五、异常处理:给程序加个安全网
delphi复制tryHttp.Post(...);excepton E: EIdHTTPProtocolException doShowMessage('服务器崩了!错误码:' + E.ErrorCode); // 显示HTTP状态码 on E: EIdSocketError doShowMessage('网络炸了:' + E.Message);end;
高频错误:
404/500 → 查接口文档或参数格式;
连接超时 → 调
Http.ConnectTimeout至5000毫秒。
知识盲区预警:
为什么Timeout设再大也会偶发失败?可能和Indy版本线程模型相关……(摊手)
六、终极省力方案
懒得写代码?直接拖控件:
工具栏拉
TIdHTTP组件;双击事件粘贴示例代码;
按F9运行 → 收工?!
暴论观点:
用WinInet?代码量多三倍还更难调试,除非系统限制必须用它——IdHTTP才是Delphi亲儿子!