Как создать действительный 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

перед реальным сообщением.

Я что-то упустил, чтобы создать правильный ответ?

Спасибо

, 👍1


1 ответ


Лучший ответ:

1

HTTP требует пустой строки после заголовков HTTP.

Первая строка — это строка состояния. Затем строки заголовка. Заголовки завершаются пустой строкой. Затем следует тело ответа. Терминатор строки для HTTP — \r\n. Функция Arduino println() использует \r\n.

Ответ с телом должен содержать заголовок Content-type и Content-length. Альтернативой Content-lenght является «фрагментированное» Transfer-Encoding.

Библиотека ESP8266WebServer обрабатывает HTTP за вас.

,

вы не отправляете длину содержимого, поэтому клиент не знает, где заканчивается тело. он ждет дополнительных данных, и вы закрываете соединение. браузер допускает это или имеет некоторую ориентацию в структуре тела (html-теги?), @Juraj

идеально. Он всегда печатает string.length() в Content-Length. Спасибо, @GiuMex