如何使用WinInet在Delphi 2010中发送HTTP Post请求
参见英文答案 >
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. 小问题 > INTERNET_OPEN_TYPE_PRECONFIG或INTERNET_OPEN_TYPE_PRECONFIG:INTERNET_OPEN_TYPE_PRECONFIG就足够了. 示例代码 我使用以下代码来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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |