我想使用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请求所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)