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

如何使用WinInet在Delphi 2010中发送HTTP Post请求,第1张

概述参见英文答案 > How to send a HTTP POST Request in Delphi using WinInet api                                    3个 我想使用WinInet在Delphi 2010中发送HTTP Post请求,但我的脚本不起作用; / 这是我的Delphi脚本: uses WinInet;procedure TFor @H_419_6@ 参见英文答案 > 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);
解决方法@H_404_25@ 主要问题:

> 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.

总结

以上是内存溢出为你收集整理的如何使用WinInet在Delphi 2010中发送HTTP Post请求全部内容,希望文章能够帮你解决如何使用WinInet在Delphi 2010中发送HTTP Post请求所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1270851.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存