← Назад к вопросам

Что такое HTTP Response?

1.6 Junior🔥 121 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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Установить cookiesession=value; Path=/; HttpOnly
LocationURL для редиректа/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
   - Если файл: предлагает скачать

Лучшие практики

  1. Правильно выбирай status code

    • 200 для успеха
    • 201 для создания ресурса
    • 400 для ошибки клиента
    • 500 для ошибки сервера
  2. Используй правильный Content-Type

    .contentType(MediaType.APPLICATION_JSON)
    .contentType(MediaType.TEXT_HTML)
    .contentType(MediaType.APPLICATION_PDF)
    
  3. Кешируй когда возможно

    .header("Cache-Control", "max-age=3600, public")
    
  4. Добавляй Security заголовки

    .header("X-Content-Type-Options", "nosniff")
    .header("X-Frame-Options", "DENY")
    

HTTP Response — это критичная часть веб-приложений, и понимание её структуры и деталей необходимо для разработки качественных API и веб-сервисов.

Что такое HTTP Response? | PrepBro