I found this script How to send a HTTP POST Request in Delphi using WinInet api
but in Delphi Xe6 doesn't run correctly
My XE6 code is
procedure TForm2.WebPostData(const UserAgent: WideString; const Server: string; const Resource: WideString; const Data: WideString);
var
hInet: HINTERNET;
hHTTP: HINTERNET;
hReq: HINTERNET;
pRequest: HINTERNET;
Buffer: array[0..1023] of AnsiChar;
i, BufferLen: cardinal;
Res: string;
Heade : TStringStream;
BufStream : TMemoryStream;
aBuffer : Array[0..4096] of Char;
BytesRead : Cardinal;
resu : AnsiString;
const
// post: packed array[0..4] of LPWSTR = (PWideChar('POST'), nil);
accept: packed array[0..1] of LPWSTR = (PChar('*/*'), nil);
// header: string = 'Content-Type: application/x-www-form-urlencoded;charset=utf-8';
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, PWideChar('POST'), PWideChar(Resource), nil, nil, @accept, 0, 1);
// hReq := HttpOpenRequest(hHTTP, @post, PWideChar(Resource), nil, nil, @accept, 0, 1);
{
pRequest := hReq;
if Assigned(pRequest) then
try
Heade := TStringStream.Create('');
try
with Heade do
begin
WriteString('Host: ' + 'www.site.com' + sLineBreak);
WriteString('User-Agent: Custom program 1.0'+SLineBreak);
WriteString('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'+SLineBreak);
WriteString('Accept-Language: en-us,en;q=0.5' + SLineBreak);
WriteString('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+SLineBreak);
WriteString('Keep-Alive: 300'+ SLineBreak);
WriteString('Connection: keep-alive'+ SlineBreak+SLineBreak);
end;
HttpAddRequestHeaders(pRequest, PChar(Heade.DataString), Length(Heade.DataString), HTTP_ADDREQ_FLAG_ADD);
if HTTPSendRequest(pRequest, nil, 0, Pointer(Data), Length(Data)) then
begin
BufStream := TMemoryStream.Create;
try
while InternetReadFile(pRequest, @aBuffer, SizeOf(aBuffer), BytesRead) do
begin
if (BytesRead = 0) then Break;
BufStream.Write(aBuffer, BytesRead);
end;
aBuffer[0] := #0;
BufStream.Write(aBuffer, 1);
Resu := PChar(BufStream.Memory);
ShowMessage(Resu);
finally
BufStream.Free;
end;
end;
finally
Heade.Free;
end;
finally
InternetCloseHandle(pRequest);
end;
}
try
// if not HttpSendRequest(hReq, System.PWideChar(header), Length(System.PWideChar(header)), PWideChar(Data), length(Data)) then begin
if not HTTPSendRequest(hReq, nil, 0, Pointer(Data), Length(Data)) then begin
ShowMessage('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
end else begin
repeat
InternetReadFile(hReq, @Buffer, SizeOf(Buffer), BufferLen);
if BufferLen = SizeOf(Buffer) then
Res := Res + AnsiString(Buffer)
else if BufferLen > 0 then
for i := 0 to BufferLen - 1 do
Res := Res + Buffer[i];
until BufferLen = 0;
ShowMessage(Res);
end;
finally
InternetCloseHandle(hReq);
end;
finally
InternetCloseHandle(hHTTP);
end;
finally
InternetCloseHandle(hInet);
end;
end;
my php code is
echo 'metodo ' . $_SERVER['REQUEST_METHOD'];
$post = file_get_contents('php://input');
print_r($post);
print_r($_GET['value']);
print_r($_POST['value']);
print_r($_REQUEST['value']);
?>
bye
but php tell me that method is GET In fact, I can not read the variable $ _POST