problèmes majeurs:
Le second paramètre de InternetConnect
ne doit contenir que le nom du serveur et non l'URL complète du script côté serveur.
Le troisième paramètre de HttpOpenRequest
devrait être le nom de fichier (URL) du script, pas les données POST!
Les données POST réelles doivent être le quatrième paramètre de HttpSendRequest
.
Problèmes mineurs
Exemple de code
J'utilise le code suivant à données 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, 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;
Par exemple:
WebPostData('My UserAgent', 'www.rejbrand.se', 'mydir/myscript.asp', 'value=5');
mise à jour en réponse à répondre par OP
Pour lire les données à partir d'Internet, utilisez la fonction InternetReadFile
. J'utilise le code suivant pour lire un petit (une ligne) fichier texte à partir de l'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;
Exemple d'utilisation:
WebGetData('My UserAgent', 'www.rejbrand.se', '/MyDir/update/ver.txt')
Cette fonction lit ainsi que des données, sans POST avant. Cependant, la fonction InternetReadFile
peut également être utilisée avec une poignée créée par HttpOpenRequest
, elle fonctionnera donc aussi dans votre cas. Vous savez que la référence WinInet est MSDN, non? Toutes les fonctions de l'API Windows sont décrites en détail, par exemple InternetReadFile.
Veuillez formater votre code en indentant toutes les lignes avec 4 espaces. La syntaxe en surbrillance sera ensuite appliquée. –
Parfois, il est plus facile de le faire vous-même. Vous êtes également autorisé à modifier la question. –
oh, mon erreur, mais sans cela, il ne fonctionne toujours pas – noxwow