如何使用WinInet在Delphi2010中发送HTTP Post请求
我想在Delphi2010中使用WinInet发送HTTP Post请求,但我的脚本无法工作/ 这是我的Delphi脚本:如何使用WinInet在Delphi2010中发送HTTP Post请求,delphi,http,post,wininet,Delphi,Http,Post,Wininet,我想在Delphi2010中使用WinInet发送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
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, nil, 0);
if Assigned(hNet) then
begin
try
hURL := InternetConnect(hNet,PChar('http://localhost/delphitest.php'),INTERNET_DEFAULT_HTTP_PORT,nil,nil,INTERNET_SERVICE_HTTP,0,DWORD(0));
if(hURL<>nil) then
hRequest := HttpOpenRequest(hURL, 'POST', PChar('test=test'),'HTTP/1.0',PChar(''), nil, INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE,0);
if(hRequest<>nil) then
HttpSendRequest(hRequest, nil, 0, nil, 0);
InternetCloseHandle(hNet);
except
ShowMessage('error');
end
end;
end;
主要问题:
的第二个参数应仅包含服务器名称,而不是服务器端脚本的整个URLInternetConnect
的第三个参数应该是脚本的文件名(URL),而不是POST数据HttpOpenRequest
- 实际POST数据应该是
的第四个参数HttpSendRequest
:使用INTERNET\u OPEN\u TYPE\u prefig或INTERNET\u OPEN\u TYPE\u prefig
就足够了INTERNET\u OPEN\u TYPE\u prefig
太过分了<代码>0就足够了DWORD(0)
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, nil, nil, 0);
try
hHTTP := InternetConnect(hInet, PChar(Server), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
try
hReq := HttpOpenRequest(hHTTP, PChar('POST'), PChar(Resource), nil, nil, @accept, 0, 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), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hURL := InternetOpenUrl(hInet, PChar('http://' + Server + Resource), nil, 0, 0, 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', 'www.rejbrand.se', '/MyDir/update/ver.txt')
因此,此函数只读取数据,没有预先发布。但是,InternetReadFile
函数也可以与由HttpOpenRequest
创建的句柄一起使用,因此它也适用于您的情况。您知道WinInet引用是MSDN,对吗?例如,所有Windows API函数都在此处详细描述。上有一个库(称为“HTTPGet component for Delphi 32”)。它将可视化控件安装到组件调色板中。
它完全符合您的要求,因此您可能想看一看。请将所有行缩进4个空格来格式化代码。然后将应用语法突出显示。有时自己做更容易。你也可以编辑这个问题。哦,我的错误,但是如果没有这个,它仍然不起作用。谢谢,我已经合并了这些脚本,脚本现在看起来像这样:按预期工作。再次感谢。@noxwow“Check”似乎不是一个很好的方法名称。我使用的是turbo delphi,上面写着:[Pascal Fehler]uHTTP.pas(22):E2010不兼容类型:“Char”和“WideChar”。。如何修复X?在WebPostData中,为什么对参数数据类型使用AnsiString而不是字符串?String是WideString。另外,为什么要使用AnsiChar作为缓冲区,这是否意味着响应文本将使用ANSI而不是Unicode?使用Firefox UserAgent有什么原因吗?没有。这只是我曾经尝试下载html页面时的一个遗留问题,在该页面中,我收到了一条消息“使用真正的浏览器”,而不是我想要的html。
WebGetData('My UserAgent', 'www.rejbrand.se', '/MyDir/update/ver.txt')
var
BufferIn : INTERNET_BUFFERS;
Buffer: array[0..1024] of Byte;
FTmp: TSomeStream:
FURL: string;
...
begin
... // Create FTmp, set FUrl, ...
NetHandle := InternetOpen( 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3',
INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
UrlHandle := HttpOpenRequest(NetHandle, 'POST', PChar(FURL), nil, nil, nil, INTERNET_FLAG_NO_CACHE_WRITE, 0);
... // Check handles, etc
try
BufferIn.dwBufferTotal := FTmp.Size;
if not HttpSendRequestEx(UrlHandle, @BufferIn, nil, 0, 0) then
raise Exception.CreateFmt('Error on HttpSendRequestEx %d\n', [GetLastError()]);
size := FTmp.Read(Buffer, 1024);
InternetWriteFile(UrlHandle, @Buffer, size, BytesWritten);
while (BytesWritten = size) and (BytesWritten > 0) do
begin
size := FTmp.Read(Buffer, 1024);
InternetWriteFile(UrlHandle, @Buffer, size, BytesWritten);
end;
finally
FTmp.Free;
InternetCloseHandle(UrlHandle);
InternetCloseHandle(NetHandle);
end;