如何使用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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
