Delphi中idHttpServer与Http(S)
【摘要】 尼采:更高级的哲人独处着,这并不是因为他想孤独,而是因为在他的周围找不到他的同类......当idhttpServer接收application/x-www-form-urlencoded时:可以使用ARequestInfo.Params.Text这种来接收,但application/json时则为空,因此使用以下方式1、开启httpServer 1)引用系统单元IdHTTPServer ...
尼采:更高级的哲人独处着,这并不是因为他想孤独,而是因为在他的周围找不到他的同类......
当idhttpServer接收application/x-www-form-urlencoded时:
可以使用ARequestInfo.Params.Text这种来接收,但application/json时则为空,因此使用以下方式
1、开启httpServer
1)引用系统单元IdHTTPServer
2)代码段:
httpServer.Active := False;
httpServer.DefaultPort := 8888;
httpServer.Bindings.Clear;
httpServer.Bindings.Add.IP := '127.0.0.1';
httpServer.Active := True;
2、事件CommandGet
procedure CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
ARequestStr: string;
ARequestStream: TStringStream;
begin
if ARequestInfo.PostStream = nil then
Exit;
ARequestStream:= TStringStream.Create('',TEncoding.UTF8);
ARequestStream.CopyFrom(ARequestInfo.PostStream, ARequestInfo.PostStream.Size);
ARequestStr:= ARequestStream.DataString;
ARequestStream.free;
end;
3、http与https通用请求,其中https不依赖SSL
1)不依赖libeay32.dll、ssleay32.dll,这俩个文件还有版本选择,即:在Delphi中使用IdSSLOpenSSL.pas文件时,需要指定,示例代码段如下:
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
//TIdSSLVersion = (sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2)
//这个跟系统有关联
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv2;
TidHttp(类,需要引用idHttp单元文件).IOHandler := IdSSLIOHandlerSocketOpenSSL;
2)基于以上原因,因此使用TNetHTTPClient,我用的XE10.3
- 引用系统单元System.Net.HttpClientComponent
- 代码段:
-
function HttpPost(AWholeURL: string; AInputStream: TStringStream; var AOutPutStrResult: string): Boolean; var AEncodeURL : TStringStream; AEncodeURLStr : string; AhttpObj : TNetHTTPClient; //不再依赖Windows的OpenSSL AExceptStr : string; begin Result := False; AhttpObj := TNetHTTPClient.Create(nil); try try AEncodeURL := TStringStream.Create(AWholeURL, TEncoding.UTF8); AEncodeURL.Position := soFromBeginning;//TStringStream不指定位置也可以 AEncodeURLStr := AEncodeURL.ReadString(AEncodeURL.Size); AhttpObj.ContentType := 'application/x-www-form-urlencoded; charset=UTF-8';; // 定义发送mime类型 AhttpObj.ConnectionTimeout := 20 * 1000; AhttpObj.ResponseTimeout := 20 * 1000; //发送 AOutPutStrResult := AhttpObj.Post(AEncodeURLStr, AInputStream).ContentAsString(TEncoding.UTF8); Result := True; except on E : Exception do begin AExceptStr := '发送数据错误原因:' + E.Message; end; end; finally if AhttpObj <> nil then AhttpObj.Free; end; end;
4、其他待补充
1)idHttpServer收到请求后会启动线程处理
2)idHttpServer支持不了高并发
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)