Delphi中idHttpServer与Http(S)

举报
走在那条路上 发表于 2023/11/29 20:33:41 2023/11/29
【摘要】 尼采:更高级的哲人独处着,这并不是因为他想孤独,而是因为在他的周围找不到他的同类......当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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。