Я так понял любой 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");