Вопрос №109 от пользователя user-5ee8b64c700a38b8 в уроке «Основы HTTP», курс «Протокол HTTP»
Протокол HTTP
→
Основы HTTP
(архив)
2 Task.
telnet localhost[enter]
POST /login HTTP/1.1[enter]
HOST:hexlettesthost.com[enter]
Content-Length:28[enter]
Content-Type:application/x-www-form-urlencoded[enter]
....и тишина.....Пробовал к другим сайтам подключаться по этому типу - они после Content-Type:application/x-www-form-urlencoded
высылают форму в ответ на которую и надо делать user=user&password=pass
.
Тут же отклика с сервера не приходит,пока не нажмешь нужное число раз Enter(тогда выкинет ошибку) или если отправить login=user&password=12345678
- получим
<HEAD><TITLE>Bad Request</TITLE></HEAD>
<BODY>
<H1>Bad Request</H1>
bad header 'login=user&password=12345678\r\n'.
<HR>
<ADDRESS>
WEBrick/1.3.1 (Ruby/2.1.5/2014-11-13) at
946df2cb4947:80
</ADDRESS>
</BODY>
</HTML>
Видно что жалуется на хедер,но какаой тут хедер если я уже должен отправлять данные а не заголовки...
- Вы забыли про закрытие соединения (Connection: close).
- То, что другие серверы высылают в ответ форму, скорее всего является неправильной реализацией REST с их стороны.
"....и тишина...." Вы же сказали серверу размер body (заголовок content-lenght), а сами его не передали. Вот он и ждет).
Ждёт,али нет- спорный вопрос) Давайте по порядку:
root@946df2cb4947:/usr/src/app# telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is ']'.
POST /login HTTP/1.1
HOST:hexlettesthost.com
Content-length:28
Content-Type:application/x-www-form-urlencoded
Connection:сlose
login=user&password=12345678
...и?Тишина...Когда закрывать соединение то?После формирования адреса и типа запроса?Смысла нет - сервер от нас отбрыкивается сразу.
После указания размера сообщения и типа передаваемых данных?Тоже не работает...может я что то делаю не так?))Ну не хочет он принимать у меня логин и пасс.
сlose,поменял.Не срабатывает =)
Вот смотрите, строка где фигурирует login pass это body, но как об этом узнает сервер? А вдруг там снова заголовок? Этот момент описан в протоколе http. Body отделяется от заголовков специальным образом. Вы же просто делаете перевод строки и не важно что выше идет content-lenght, порядок заголовков вообще не имеет значения, кроме перовой строки. Весь http запрос всегда делится на headers и body, у вас передается только headers (хотя там присутствует строка которую вы считаете за body).
Сдал.Спасибо за комментарии,всё решалось проще чем кажется на первый взгляд.
Поясните, пожалуйста: сделал также: "POST /login HTTP/1.1 HOST:hexlettesthost.com Content-length:28 Content-Type:application/x-www-form-urlencoded Connection:сlose login=user&password=12345678"
"Весь http запрос всегда делится на headers и body, у вас передается только headers (хотя там присутствует строка которую вы считаете за body)." - вот здесь хотелось бы прояснить, как же в запросе все-таки указать, что строчка login=user&password=12345678 - это и есть body? Что-то не разобрался.
В протоколе http
body
отделяется от заголовков дополнительным переводом строки или, как говорят, пустой строкой.
Когда я делаю перевод строчки после Connection: close мне сразу приходит такой ответ:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD><TITLE>Not Found</TITLE></HEAD>
<BODY>
<H1>Not Found</H1>
`/login' not found.
<HR>
<ADDRESS>
WEBrick/1.3.1 (Ruby/2.1.5/2014-11-13) at
hexlettestform.com:80
</ADDRESS>
</BODY>
</HTML>
и передать тело запроса login=user&password=12345678 уже не получается. Что я не так делаю?
Константин, скопируйте сюда ваш запрос, начиная со строчки telnet ...
А откуда вы взяли хост hexlettestform.com
? В задании другой
Александр, все получилось! Спасибо, что указали на ошибку. В 3 утра выполнял задание, действительно просто перепутал хост. Все получилось! Кирилл, также большое спасибо!
Рад, что получилось :)
Всё же решил посмотреть комментарии и тем не менее путь к решению проблемы со вторым заданием яснее не стал. Пишу: ``` telnet localhost 8080
POST /login HTTP/1.1 HOST:hexlettesthost.com Content-length:28 Content-Type:application/x-www-form-urlencoded Connection:сlose
После конекшн клос нажимаю два ентера, сразу выдает ответ, без возможности передать логин и пароль. Два ентера перед конекшн клос тоже отправляет текст серверу. Пробовал \r\n результат не поменялся зависает в ожидании второго ентера.
- Два ентера перед конекшн клос тоже отправляет текст серверу
А какую реакцию вы ожидали на это? :)
Какой ответ вам приходит в ответ?
Используйте Хекслет по-максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт