Где ошибка в моем посте tidtcpclient? - PullRequest
0 голосов
/ 26 декабря 2018

Я получил неверный запрос, что не так в моем коде

procedure TForm1.Button1Click(Sender: TObject);
begin
  TCPClient1.Host :='aavtrain.com';
  TCPClient1.Port := 80;
  TCPClient1.ConnectTimeout := 10000;
  TCPClient1.OnConnected := TCPClient1Connected;
  TCPClient1.ReadTimeout := 5000;
  TCPClient1.Connect;
end;

procedure TForm1.TCPClient1Connected(Sender: TObject);
var
  s: string;
begin
  //
  TCPClient1.Socket.WriteLn('POST HTTP/1.1');
  TCPClient1.Socket.WriteLn(sLineBreak);
  IdTCPClient1.Socket.WriteLn('http://aavtrain.comindex.asp');
  IdTCPClient1.Socket.WriteLn(sLineBreak);
  TCPClient1.Socket.WriteLn('user_name=binary');
  TCPClient1.Socket.WriteLn('&password=12345');
  TCPClient1.Socket.WriteLn('&Submit=Submit');
  TCPClient1.Socket.WriteLn('&login=true');
  TCPClient1.Socket.WriteLn(sLineBreak);
  repeat
    s := TCPClient1.Socket.ReadLn('');
    Memo1.Lines.Add(s);
  until s.Contains('try again');
  TCPClient1.Disconnect;
end;

1 Ответ

0 голосов
/ 26 декабря 2018

Ваше 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.Реализовать все с нуля нетривиально, поскольку это очень сложный и сложный протокол.

...