Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
HTTP Response: структура и детали
HTTP Response — это сообщение, которое отправляет сервер клиенту (обычно веб-браузер) в ответ на HTTP Request. Это ответ на запрос клиента, содержащий статус выполнения, метаданные и данные.
Структура HTTP Response
HTTP Response состоит из трёх частей:
┌─────────────────────────────────────┐
│ STATUS LINE (Строка статуса) │
├─────────────────────────────────────┤
│ HEADERS (Заголовки) │
├─────────────────────────────────────┤
│ BODY (Тело ответа) │
└─────────────────────────────────────┘
1. Status Line (Строка статуса)
Описывает результат обработки запроса:
HTTP/1.1 200 OK
│ │ │
│ │ └─ Reason Phrase (Описание)
│ └───── Status Code (Код)
└────────────── HTTP Version (Версия)
Примеры:
HTTP/1.1 200 OK (Успешный ответ)
HTTP/1.1 404 Not Found (Ресурс не найден)
HTTP/1.1 500 Internal Server Error (Ошибка сервера)
HTTP/2 204 No Content (Успех, но нет содержимого)
2. Headers (Заголовки)
Метаданные, описывающие ответ. Формат: Name: Value, каждый на новой строке.
Content-Type: application/json
Content-Length: 1234
Set-Cookie: session_id=abc123; Path=/
Cache-Control: max-age=3600
ETag: "12345abcde"
Location: /new-page
Важные заголовки:
| Заголовок | Описание | Пример |
|---|---|---|
| Content-Type | Тип содержимого | application/json, text/html, image/png |
| Content-Length | Размер тела в байтах | 1024 |
| Set-Cookie | Установить cookie | session=value; Path=/; HttpOnly |
| Location | URL для редиректа | /api/users/123 |
| Cache-Control | Управление кешем | max-age=3600, no-cache, public |
| ETag | Версия ресурса | "33a64df"; "33a64df;gzip" |
| Last-Modified | Дата последнего изменения | Wed, 21 Oct 2025 07:28:00 GMT |
| Server | Информация о сервере | Apache/2.4.1, nginx/1.25 |
| *Access-Control- ** | CORS заголовки | Access-Control-Allow-Origin: * |
| X-Custom-Header | Пользовательский заголовок | Depends on app |
3. Body (Тело ответа)
Данные, возвращаемые клиенту. Может быть:
- JSON
- HTML
- Изображение
- Файл
- Пусто
Status Codes (Коды состояния)
Коды состояния HTTP сгруппированы по категориям:
1xx: Informational (Информационные)
100 Continue - Продолжай отправку
101 Switching Protocols - Переход на другой протокол
2xx: Success (Успех)
200 OK - Запрос успешно обработан
201 Created - Ресурс создан
202 Accepted - Запрос принят на обработку
204 No Content - Успех, но нет содержимого
206 Partial Content - Частичное содержимое (range requests)
3xx: Redirection (Переадресация)
300 Multiple Choices - Несколько вариантов
301 Moved Permanently - Постоянный редирект
302 Found - Временный редирект (ВАЖНО!)
304 Not Modified - Кеш актуален, не отправляем тело
307 Temporary Redirect - Временный редирект (сохраняет метод)
4xx: Client Error (Ошибка клиента)
400 Bad Request - Некорректный запрос
401 Unauthorized - Требуется аутентификация
403 Forbidden - Доступ запрещён
404 Not Found - Ресурс не найден
405 Method Not Allowed - Метод не поддерживается
409 Conflict - Конфликт (например, дублирование)
429 Too Many Requests - Слишком много запросов (rate limiting)
5xx: Server Error (Ошибка сервера)
500 Internal Server Error - Внутренняя ошибка сервера
501 Not Implemented - Метод не реализован
502 Bad Gateway - Плохой шлюз
503 Service Unavailable - Сервис недоступен
504 Gateway Timeout - Timeout шлюза
Пример полного HTTP Response
HTTP/1.1 200 OK
Date: Mon, 23 Mar 2026 10:00:00 GMT
Server: Apache/2.4.41
Content-Type: application/json
Content-Length: 128
Connection: keep-alive
Cache-Control: max-age=3600
ETag: "12345abc"
{
"id": 1,
"name": "John Doe",
"email": "john@example.com",
"created_at": "2025-03-23T10:00:00Z"
}
Работа с HTTP Response в Java
Используя HttpURLConnection
import java.net.*;
import java.io.*;
public class HttpResponseExample {
public static void main(String[] args) throws Exception {
URL url = new URL("https://api.example.com/users/1");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Установим request метод
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/json");
// Получаем status code
int statusCode = connection.getResponseCode();
System.out.println("Status: " + statusCode);
// Читаем заголовки
Map<String, List<String>> headers = connection.getHeaderFields();
headers.forEach((name, values) -> {
System.out.println(name + ": " + String.join(", ", values));
});
// Читаем тело
try (InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
String line;
StringBuilder body = new StringBuilder();
while ((line = br.readLine()) != null) {
body.append(line);
}
System.out.println("Body: " + body.toString());
}
}
}
Используя Spring's RestTemplate
import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpHeaders;
@RestController
@RequestMapping("/api")
public class ApiController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
// Создаём HTTP request
String url = "https://jsonplaceholder.typicode.com/users/" + id;
// Получаем response
ResponseEntity<User> response = restTemplate.getForEntity(url, User.class);
// Доступ к status code
HttpStatus status = response.getStatusCode();
System.out.println("Status: " + status);
// Доступ к headers
HttpHeaders headers = response.getHeaders();
String contentType = headers.getContentType().toString();
// Доступ к body
User user = response.getBody();
return response; // Отправляем клиенту
}
}
Используя HttpClient (Java 11+)
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://api.example.com/users/1"))
.header("Accept", "application/json")
.GET()
.build();
// Отправляем request и получаем response
HttpResponse<String> response = client.send(
request,
HttpResponse.BodyHandlers.ofString()
);
// Status code
System.out.println("Status: " + response.statusCode());
// Headers
response.headers().map().forEach((name, values) ->
System.out.println(name + ": " + values)
);
// Body
System.out.println("Body: " + response.body());
}
}
Используя Spring's WebClient (Reactive)
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class ApiService {
private WebClient webClient;
public Mono<User> getUserAsync(Long id) {
return webClient.get()
.uri("/users/{id}", id)
.retrieve()
.onStatus(
status -> !status.is2xxSuccessful(),
response -> response.createException()
)
.bodyToMono(User.class);
}
}
Обработка разных типов Response
@RestController
public class ResponseController {
// JSON ответ
@GetMapping("/json")
public ResponseEntity<User> getJson() {
User user = new User(1L, "John", "john@example.com");
return ResponseEntity.ok(user);
}
// HTML ответ
@GetMapping("/html")
public ResponseEntity<String> getHtml() {
String html = "<html><body>Hello World</body></html>";
return ResponseEntity
.ok()
.contentType(MediaType.TEXT_HTML)
.body(html);
}
// File download
@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile() throws IOException {
byte[] fileContent = Files.readAllBytes(Paths.get("/path/to/file.pdf"));
return ResponseEntity
.ok()
.contentType(MediaType.APPLICATION_PDF)
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"file.pdf\"")
.body(fileContent);
}
// Redirect
@GetMapping("/redirect")
public ResponseEntity<Void> redirect() {
return ResponseEntity
.status(HttpStatus.MOVED_PERMANENTLY)
.location(URI.create("/new-path"))
.build();
}
// Ошибка с деталями
@GetMapping("/error")
public ResponseEntity<Map<String, String>> getError() {
Map<String, String> error = new HashMap<>();
error.put("message", "Resource not found");
error.put("code", "404");
error.put("timestamp", LocalDateTime.now().toString());
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(error);
}
}
Жизненный цикл HTTP Response
1. Клиент отправляет HTTP Request
↓
2. Сервер получает и обрабатывает
↓
3. Сервер формирует HTTP Response
- Определяет status code
- Добавляет заголовки
- Подготавливает body
↓
4. Сервер отправляет Response клиенту
↓
5. Клиент получает Response
- Читает status code
- Читает заголовки
- Читает body
↓
6. Браузер обрабатывает ответ
- Если HTML: рендерит страницу
- Если JSON: передаёт JavaScript
- Если файл: предлагает скачать
Лучшие практики
-
Правильно выбирай status code
- 200 для успеха
- 201 для создания ресурса
- 400 для ошибки клиента
- 500 для ошибки сервера
-
Используй правильный Content-Type
.contentType(MediaType.APPLICATION_JSON) .contentType(MediaType.TEXT_HTML) .contentType(MediaType.APPLICATION_PDF) -
Кешируй когда возможно
.header("Cache-Control", "max-age=3600, public") -
Добавляй Security заголовки
.header("X-Content-Type-Options", "nosniff") .header("X-Frame-Options", "DENY")
HTTP Response — это критичная часть веб-приложений, и понимание её структуры и деталей необходимо для разработки качественных API и веб-сервисов.