Ваше HTTP-сообщение полностью неправильно сформировано, каждая отдельная строка , которую вы отправляете на сервер, неверна.
HTTP-сообщение состоит из трех частей- одиночная строка запроса / ответа, за которой сразу следуют заголовки, а затем тело.Заголовки и тело разделены одной последовательностью CRLF CRLF
, но вы отправляете последовательность CRLF CRLF CRLF
после строки запроса POST
.Фактически, вы отправляете слишком много разрывов строк в общем.
В самой строке POST
отсутствует путь к запрашиваемому ресурсу.
Вы не отправляете заголовки HTTP ввсе.Вы запрашиваете HTTP 1.1, для которого требуется заголовок a Host
.И вы не отправляете заголовок Content-Type
, поэтому сервер знает, какие данные вы публикуете, или заголовок Content-Length
, поэтому сервер знает, сколько данных вы публикуете.
Само тело сообщенияискажен тоже.Вы должны отправлять значения веб-формы как одну строку, а не как отдельные строки для каждого значения.
Попробуйте вместо этого:
procedure TForm1.Button1Click(Sender: TObject);
var
PostData, Response: string;
Enc: IIdTextEncoding;
begin
PostData := 'user_name=binary&password=12345&Submit=Submit&login=true';
Enc := IndyTextEncoding_UTF8;
//
TCPClient1.Host := 'aavtrain.com';
TCPClient1.Port := 80;
TCPClient1.ConnectTimeout := 10000;
TCPClient1.ReadTimeout := 5000;
TCPClient1.Connect;
try
TCPClient1.Socket.WriteLn('POST /index.asp HTTP/1.1');
TCPClient1.Socket.WriteLn('Host: aavtrain.com');
TCPClient1.Socket.WriteLn('Content-Type: application/x-www-form-urlencoded; charset=utf-8');
TCPClient1.Socket.WriteLn('Content-Length: ' + IntToStr(Enc.GetByteCount(PostData)));
TCPClient1.Socket.WriteLn('Connection: close');
TCPClient1.Socket.WriteLn;
TCPClient1.Socket.Write(PostData, Enc);
// the following is NOT the right way to read
// an HTTP response. This is just an example.
// I'll leave it as an exercise for you to
// research and figure out the proper way.
// I've posted pseudo code for this on
// StackOverflow many times before...
Response := TCPClient1.Socket.AllData;
finally
TCPClient1.Disconnect;
end;
Memo1.Text := Response;
end;
Пожалуйста, прочитайте RFC 2616 и связанные с ними RFC, а также спецификации W3C при отправке веб-форм HTML (см. HTML 4.01 и HTML5 ), поскольку очевидно, что вы не понимаете, как на самом деле работает HTTP.Реализовать все с нуля нетривиально, поскольку это очень сложный и сложный протокол.