Как создать действительный HTTP-ответ. Ошибка приема: сброс соединения узлом (Recv failure: Connection reset by peer)
Я разрабатываю сервер Arduino, который должен отвечать сообщением при получении запроса POST.
Если я тестирую свой проект с помощью HTTP-клиента (например, Insomnia или Postman), я получаю сообщение об ошибке:
Error: Failure when receiving data from the peer
Я все еще получаю ответ, который могу прочитать, но с последней ошибкой.
Это просьба моего клиента:
> POST /SOMETHING/ HTTP/1.1
> Host: [ARDUINO IP]
> User-Agent: insomnia/6.2.0
> Accept: */*
> Content-Length: 0
А вот мой ответ Arduino, который считается недействительным:
< HTTP/1.1 200 OK
< Connection: close
< [MY MESSAGE]
* Recv failure: Connection reset by peer
* stopped the pause stream!
* Closing connection 2
Как вы можете заметить, я только что добавил 2 строки
HTTP/1.1 200 OK
Connection: close
перед реальным сообщением.
Я что-то упустил, чтобы создать правильный ответ?
Спасибо
@GiuMex, 👍1
1 ответ
Лучший ответ:
HTTP требует пустой строки после заголовков HTTP.
Первая строка — это строка состояния. Затем строки заголовка. Заголовки завершаются пустой строкой. Затем следует тело ответа. Терминатор строки для HTTP — \r\n. Функция Arduino println() использует \r\n.
Ответ с телом должен содержать заголовок Content-type и Content-length. Альтернативой Content-lenght является «фрагментированное» Transfer-Encoding.
Библиотека ESP8266WebServer обрабатывает HTTP за вас.
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Проанализировать большой ответ json с помощью ESP8266
- ESP8266 не отвечает через случайные промежутки времени
- Код запроса ESP8266 GET -1
- esp32 http client response только 200 не получил данные после этого
вы не отправляете длину содержимого, поэтому клиент не знает, где заканчивается тело. он ждет дополнительных данных, и вы закрываете соединение. браузер допускает это или имеет некоторую ориентацию в структуре тела (html-теги?), @Juraj
идеально. Он всегда печатает
string.length()
в Content-Length. Спасибо, @GiuMex