加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何使用WinInet api在Delphi中发送HTTP POST请求

发布时间:2020-12-15 03:34:05 所属栏目:大数据 来源:网络整理
导读:我试图使用WinInet函数从Delphi发出HTTP请求. 到目前为止我有: function request:string;var hNet,hURL,hRequest: HINTERNET;begin hNet := InternetOpen(PChar('User Agent'),INTERNET_OPEN_TYPE_PRECONFIG or INTERNET_OPEN_TYPE_PRECONFIG,nil,0); if As
我试图使用WinInet函数从Delphi发出HTTP请求.

到目前为止我有:

function request:string;
var
  hNet,hURL,hRequest: HINTERNET;
begin
  hNet := InternetOpen(PChar('User Agent'),INTERNET_OPEN_TYPE_PRECONFIG or INTERNET_OPEN_TYPE_PRECONFIG,nil,0);
  if Assigned(hNet) then 
  begin
  try
    hURL := InternetConnect(hNet,PChar('http://example.com'),INTERNET_DEFAULT_HTTP_PORT,INTERNET_SERVICE_HTTP,DWORD(0));
    if(hURL<>nil) then
      hRequest := HttpOpenRequest(hURL,'POST',PChar('param=value'),'HTTP/1.0',PChar(''),INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE,0);
    if(hRequest<>nil) then
      HttpSendRequest(hRequest,0);
    InternetCloseHandle(hNet);
  except
    on E : Exception do
      ShowMessage(E.ClassName+' error raised,with message : '+E.Message);
  end;
  end
end;

但这并不做任何事情(我正在嗅探网络http流量,看看它是否有效).
我已经成功地使用了InternetOpenURL,但是我也需要发送POST请求,并且该函数不这样做.

有人能给我一个简单的例子吗?我想要的结果是将http响应页面以var作为字符串.

解决方法

我把所有的url / filename部分搞砸了以前的代码.我正在使用这个 from Jeff DeVore,它的工作正常:
function request(const AUrl,AData: AnsiString; blnSSL: Boolean = True): AnsiString;
var
  aBuffer     : Array[0..4096] of Char;
  Header      : TStringStream;
  BufStream   : TMemoryStream;
  sMethod     : AnsiString;
  BytesRead   : Cardinal;
  pSession    : HINTERNET;
  pConnection : HINTERNET;
  pRequest    : HINTERNET;
  parsedURL   : TStringArray;
  port        : Integer;
  flags       : DWord;
begin
  ParsedUrl := ParseUrl(AUrl);

  Result := '';

  pSession := InternetOpen(nil,INTERNET_OPEN_TYPE_PRECONFIG,0);

  if Assigned(pSession) then
  try
    if blnSSL then
      Port := INTERNET_DEFAULT_HTTPS_PORT
    else
      Port := INTERNET_DEFAULT_HTTP_PORT;
    pConnection := InternetConnect(pSession,PChar(ParsedUrl[0]),port,0);

    if Assigned(pConnection) then
    try
      if (AData = '') then
        sMethod := 'GET'
      else
        sMethod := 'POST';

      if blnSSL then
        flags := INTERNET_FLAG_SECURE or INTERNET_FLAG_KEEP_CONNECTION
      else
        flags := INTERNET_SERVICE_HTTP;

      pRequest := HTTPOpenRequest(pConnection,PChar(sMethod),PChar(ParsedUrl[1]),flags,0);

      if Assigned(pRequest) then
      try
        Header := TStringStream.Create('');
        try
          with Header do
          begin
            WriteString('Host: ' + ParsedUrl[0] + sLineBreak);
            WriteString('User-Agent: Custom program 1.0'+SLineBreak);
            WriteString('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'+SLineBreak);
            WriteString('Accept-Language: en-us,en;q=0.5' + SLineBreak);
            WriteString('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+SLineBreak);
            WriteString('Keep-Alive: 300'+ SLineBreak);
            WriteString('Connection: keep-alive'+ SlineBreak+SLineBreak);
          end;

          HttpAddRequestHeaders(pRequest,PChar(Header.DataString),Length(Header.DataString),HTTP_ADDREQ_FLAG_ADD);

          if HTTPSendRequest(pRequest,Pointer(AData),Length(AData)) then
          begin
            BufStream := TMemoryStream.Create;
            try
              while InternetReadFile(pRequest,@aBuffer,SizeOf(aBuffer),BytesRead) do
              begin
                if (BytesRead = 0) then Break;
                BufStream.Write(aBuffer,BytesRead);
              end;

              aBuffer[0] := #0;
              BufStream.Write(aBuffer,1);
              Result := PChar(BufStream.Memory);
            finally
              BufStream.Free;
            end;
          end;
        finally
          Header.Free;
        end;
      finally
        InternetCloseHandle(pRequest);
      end;
    finally
      InternetCloseHandle(pConnection);
    end;
  finally
    InternetCloseHandle(pSession);
  end;
end;

ParseUrl是一个将URL分割为“hostname / filename”的功能,TStringArray是一个字符串数组.我仍然需要检查明天的代码,但它看起来不错,在我的嗅探器中,我看到发送的数据和标题被发送.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读