@MishaXXL

По какому принципу разбивается http запрос/ответ?

Я так понял любой https запрос/ответ это одна длинная строка, которая разбита на переносы строк путем "\r\n", а при двойном "\r\n\r\n" мне казалось, что это переход на следующую часть данных о запросе

Но получилось так, что "\r\n" расположился сразу после одного из заголовков
clientOutput.write(("ContentType: text/html" + "\r\n").getBytes());
clientOutput.write("\r\n".getBytes());
clientOutput.write(("Hello Java!").getBytes());
clientOutput.write("\r\n\r\n".getBytes());


Из чего состоят http запросы и как правильно читать запросы и писать ответы, по какому принципу или структура их надо разбирать и собирать?
Мне нужно написать ответ от сервера, который содержал обычную информацию + заголовки + данные
Ответ GET/POST запросов

Заголовки
"Access-Control-Allow-Origin", "*"
"Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"
"Access-Control-Allow-Credentials", "true"
"Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS,HEAD"


И сами данные в виде текста или JSON строки

Как формируется такой ответ от сервера и как браузер и сервер должны понять, где информация о запросе, где заголовки, а где данные?

Чтение запроса
StringBuilder requestBuilder = new StringBuilder();
String line;
while (!(line = buffer.readLine()).isBlank()) {
    requestBuilder.append(line + "\r\n");
}

System.out.println("Request data");
System.out.println(requestBuilder.toString());


Ответ без заголовков
OutputStream clientOutput = client.getOutputStream();
clientOutput.write(("HTTP/1.1 200 OK").getBytes());
clientOutput.write(("ContentType: text/html" + "\r\n").getBytes());
clientOutput.write("\r\n".getBytes());
clientOutput.write(("Hello Java!").getBytes());
clientOutput.write("\r\n\r\n".getBytes());
clientOutput.flush();
client.close();


В примерах с заголовками находил подобные конструкции, но они не сработали
PrintWriter output = new PrintWriter(client.getOutputStream());

output.println("Access-Control-Allow-Origin: *");
output.println();
output.println("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
output.println();
output.println("Access-Control-Allow-Credentials: true");
output.println();
output.println("Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS,HEAD");
  • Вопрос задан
  • 88 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Everything_is_bad
Из чего состоят http запросы и как правильно читать запросы и писать ответы, по какому принципу или структура их надо разбирать и собирать?
так есть же описание протокола HTTP, открывай, да изучай.

И вообще, зачем тебе это делать, зачем работать на таком низком уровне, особенно если опыта вообще нет? есть куча готовых решений, если очень хочется увидеть как это парсят, так же открывай, да читай их исходный код.
Ответ написан
Комментировать
@Dementor
программист, архитектор, аналитик
Детальный ответ на твой вопрос с примерами:
https://datatracker.ietf.org/doc/html/rfc9110
Ответ написан
Комментировать
@My1Name
По какому принципу разбивается http запрос/ответ?

По принципу стандартизации HTTP протокола.
https://ru.wikipedia.org/wiki/HTTP
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
То, какими символами разделяются заголовки и тело запроса и как надо экранировать эти символы, если их нужно впихнуть в тело, подробно описано в спецификации:

https://www.w3.org/Protocols/HTTP/1.1/draft-ietf-h...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы