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

如何使用WinInet在Delphi 2010中发送HTTP Post请求

发布时间:2020-12-15 09:43:38 所属栏目:大数据 来源:网络整理
导读:参见英文答案 How to send a HTTP POST Request in Delphi using WinInet api????????????????????????????????????3个 我想使用WinInet在Delphi 2010中发送HTTP Post请求,但我的脚本不起作用; / 这是我的Delphi脚本: uses WinInet;procedure TForm1.Button
参见英文答案 > How to send a HTTP POST Request in Delphi using WinInet api????????????????????????????????????3个
我想使用WinInet在Delphi 2010中发送HTTP Post请求,但我的脚本不起作用; /

这是我的Delphi脚本:

uses WinInet;
procedure TForm1.Button1Click(Sender: TObject);
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://localhost/delphitest.php'),INTERNET_DEFAULT_HTTP_PORT,INTERNET_SERVICE_HTTP,DWORD(0));
    if(hURL<>nil) then
      hRequest := HttpOpenRequest(hURL,'POST',PChar('test=test'),'HTTP/1.0',PChar(''),INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE,0);
    if(hRequest<>nil) then
      HttpSendRequest(hRequest,0);
    InternetCloseHandle(hNet);
  except
      ShowMessage('error');
    end
  end;
end;

和我的PHP脚本:

$data = $_POST['test'];
$file = "test.txt";
$fp = fopen($file,"a");
flock($fp,2);
fwrite($fp,$data);
flock($fp,3);
fclose($fp);

解决方法

主要问题:

> InternetConnect的第二个参数应仅包含服务器的名称,而不应包含服务器端脚本的整个URL.
> HttpOpenRequest的第三个参数应该是脚本的文件名(URL),而不是POST数据!
>实际的POST数据应该是HttpSendRequest的第四个参数.

小问题

> INTERNET_OPEN_TYPE_PRECONFIG或INTERNET_OPEN_TYPE_PRECONFIG:INTERNET_OPEN_TYPE_PRECONFIG就足够了.
> DWORD(0)太过分了. 0就够了.

示例代码

我使用以下代码来POST数据:

procedure WebPostData(const UserAgent: string; const Server: string; const Resource: string; const Data: AnsiString); overload;
var
  hInet: HINTERNET;
  hHTTP: HINTERNET;
  hReq: HINTERNET;
const
  accept: packed array[0..1] of LPWSTR = (PChar('*/*'),nil);
  header: string = 'Content-Type: application/x-www-form-urlencoded';
begin
  hInet := InternetOpen(PChar(UserAgent),INTERNET_OPEN_TYPE_PRECONFIG,0);
  try
    hHTTP := InternetConnect(hInet,PChar(Server),1);
    try
      hReq := HttpOpenRequest(hHTTP,PChar('POST'),PChar(Resource),@accept,1);
      try
        if not HttpSendRequest(hReq,PChar(header),length(header),PChar(Data),length(Data)) then
          raise Exception.Create('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
      finally
        InternetCloseHandle(hReq);
      end;
    finally
      InternetCloseHandle(hHTTP);
    end;
  finally
    InternetCloseHandle(hInet);
  end;
end;

例如:

WebPostData('My UserAgent','www.rejbrand.se','mydir/myscript.asp','value=5');

更新以回应OP的回答

要从Internet读取数据,请使用InternetReadFile函数.我使用以下代码从Internet读取一个小的(一行)文本文件:

function WebGetData(const UserAgent: string; const Server: string; const Resource: string): string;
var
  hInet: HINTERNET;
  hURL: HINTERNET;
  Buffer: array[0..1023] of AnsiChar;
  i,BufferLen: cardinal;
begin
  result := '';
  hInet := InternetOpen(PChar(UserAgent),0);
  try
    hURL := InternetOpenUrl(hInet,PChar('http://' + Server + Resource),0);
    try
      repeat
        InternetReadFile(hURL,@Buffer,SizeOf(Buffer),BufferLen);
        if BufferLen = SizeOf(Buffer) then
          result := result + AnsiString(Buffer)
        else if BufferLen > 0 then
          for i := 0 to BufferLen - 1 do
            result := result + Buffer[i];
      until BufferLen = 0;
    finally
      InternetCloseHandle(hURL);
    end;
  finally
    InternetCloseHandle(hInet);
  end;
end;

样品用法:

WebGetData('My UserAgent','/MyDir/update/ver.txt')

因此,此功能仅读取数据,而无需事先POST.但是,InternetReadFile函数也可以与HttpOpenRequest创建的句柄一起使用,因此它也适用于您的情况.你知道WinInet引用是MSDN,对吧?这里详细描述了所有Windows API函数,例如InternetReadFile.

(编辑:李大同)

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

    推荐文章
      热点阅读