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

Как подцепить Header к запросу

1.0 Junior🔥 222 комментариев
#Работа с данными#Сетевое взаимодействие

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Как добавить Header к HTTP-запросу в Android

В Android существует несколько способов добавить заголовки (Headers) к HTTP-заросам, в зависимости от используемой библиотеки или подхода. Рассмотрим основные методы для популярных библиотек.

1. Использование HttpURLConnection (стандартный способ)

URL url = new URL("https://api.example.com/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

// Установка метода запроса
connection.setRequestMethod("GET");

// Добавление заголовков
connection.setRequestProperty("Authorization", "Bearer your_token_here");
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("User-Agent", "MyApp/1.0");

// Для POST запросов с телом
connection.setDoOutput(true);
OutputStream os = connection.getOutputStream();
os.write(jsonBody.getBytes());
os.flush();
os.close();

// Чтение ответа
int responseCode = connection.getResponseCode();

2. Использование OkHttp (рекомендуемый способ)

OkHttp - наиболее популярная библиотека для работы с сетью в Android.

// Создание клиента OkHttp
val client = OkHttpClient()

// Создание запроса с заголовками
val request = Request.Builder()
    .url("https://api.example.com/data")
    .addHeader("Authorization", "Bearer token123")
    .addHeader("Content-Type", "application/json")
    .addHeader("Custom-Header", "CustomValue")
    .build()

// Выполнение запроса
client.newCall(request).enqueue(object : Callback {
    override fun onResponse(call: Call, response: Response) {
        val responseBody = response.body?.string()
        // Обработка ответа
    }
    
    override fun onFailure(call: Call, e: IOException) {
        // Обработка ошибки
    }
})

3. Interceptors в OkHttp для глобальных заголовков

Для добавления заголовков ко всем запросам можно использовать Interceptor:

val client = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val originalRequest = chain.request()
        val requestWithHeaders = originalRequest.newBuilder()
            .addHeader("Authorization", "Bearer token123")
            .addHeader("User-Agent", "MyApp/1.0")
            .build()
        chain.proceed(requestWithHeaders)
    }
    .build()

4. Использование Retrofit

Retrofit часто используется вместе с OkHttp для упрощения работы с REST API.

Способ 1: Через аннотации @Header

interface ApiService {
    @GET("users")
    suspend fun getUsers(
        @Header("Authorization") token: String,
        @Header("Custom-Header") customValue: String
    ): List<User>
}

// Использование
val apiService = retrofit.create(ApiService::class.java)
val users = apiService.getUsers("Bearer token123", "customValue")

Способ 2: Статические заголовки через @Headers

@GET("users")
@Headers(
    "Authorization: Bearer static_token",
    "Accept: application/json"
)
suspend fun getUsers(): List<User>

Способ 3: Глобальные заголовки через OkHttp Interceptor

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val request = chain.request().newBuilder()
            .addHeader("Authorization", "Bearer token123")
            .addHeader("Accept", "application/json")
            .build()
        chain.proceed(request)
    }
    .build()

val retrofit = Retrofit.Builder()
    .baseUrl("https://api.example.com/")
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

5. Динамические заголовки с Authenticator

Для автоматического обновления токенов можно использовать Authenticator:

val authenticator = object : Authenticator {
    override fun authenticate(route: Route?, response: Response): Request? {
        // Обновление токена
        val newToken = refreshToken()
        
        return response.request.newBuilder()
            .header("Authorization", "Bearer $newToken")
            .build()
    }
}

val client = OkHttpClient.Builder()
    .authenticator(authenticator)
    .build()

6. Особые случаи и best practices

  • Content-Type и Accept заголовки часто требуются для REST API
  • Authorization заголовки обычно содержат токены доступа
  • User-Agent помогает идентифицировать ваше приложение на сервере
  • Cache-Control управляет кэшированием ответов
// Пример комплексного запроса
val request = Request.Builder()
    .url("https://api.example.com/data")
    .addHeader("Authorization", "Bearer ${getAccessToken()}")
    .addHeader("Content-Type", "application/json")
    .addHeader("Accept", "application/json")
    .addHeader("Cache-Control", "no-cache")
    .addHeader("X-App-Version", BuildConfig.VERSION_NAME)
    .build()

Ключевые моменты:

  1. OkHttp + Retrofit - стандартный стек для сетевых операций
  2. Interceptors позволяют централизованно управлять заголовками
  3. Аннотации Retrofit упрощают объявление API эндпоинтов
  4. Всегда обрабатывайте истечение токенов через Authenticator
  5. Используйте BuildConfig для передачи метаданных приложения

Выбор конкретного способа зависит от архитектуры приложения и требований к гибкости управления заголовками. Для большинства проектов оптимальным является сочетание OkHttp Interceptors для глобальных заголовков и аннотаций Retrofit для специфичных заголовков отдельных запросов.

Как подцепить Header к запросу | PrepBro