如何将 header 添加到 Android 中的改造响应

How to add header to retrofit response in Android

在我的应用程序中,我想从服务器获取数据,为此我应该添加一些 header,例如 AcceptContent_Type
为了连接到服务器,我使用了 Retrofit 库。
对于 set headers 我使用 okHttp 客户端并且我写了下面的代码,但没有将 header 设置为 api 回应!
我的客户代码:

class ApiClient() {

    private val apiServices: ApiServices

    init {
        //Gson
        val gson = GsonBuilder()
            .setLenient()
            .create()

        //Http log
        val loggingInterceptor = HttpLoggingInterceptor()
        loggingInterceptor.level =
            if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE

        //Http Builder
        val clientBuilder = OkHttpClient.Builder()
        clientBuilder.interceptors().add(loggingInterceptor)
        clientBuilder.addInterceptor { chain ->
            val request = chain.request()
            request.newBuilder().addHeader(
                CONTENT_TYPE,
                APPLICATION_JSON
            ).build()
            chain.proceed(request)
        }
        clientBuilder.addInterceptor { chain ->
            val request = chain.request()
            request.newBuilder().addHeader(
                ACCEPT,
                APPLICATION_JSON
            ).build()
            chain.proceed(request)
        }

        //Http client
        val client = clientBuilder
            .readTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
            .writeTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
            .connectTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
            .callTimeout(CONNECTION_TIMEOUT, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true)
            .build()

        //Retrofit
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL + BASE_URP_PREFIX)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .addConverterFactory(ScalarsConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
            .build()

        //Init mapApiServices
        apiServices = retrofit.create(ApiServices::class.java)
    }

    companion object {
        private var apiClient: ApiClient? = null

        fun getInstance(): ApiClient =
            apiClient ?: synchronized(this) {
                apiClient
                    ?: ApiClient().also {
                    apiClient = it
                }
            }
    }
}

我该如何解决?

添加静态 header 的第一个选项是将 header 和 API 方法的相应值定义为注释。 header 由 Retrofit 使用此方法为每个请求自动添加。注释可以是 key-value-pair 作为一个字符串或作为字符串列表。

上面的示例显示了静态 header 的 key-value-definition:

此外,您可以将多个 key-value-strings 作为封装在大括号 {} 中的列表传递给 @Headers 注释。

如何将多个 key-value-strings 作为封装在大括号中的列表传递:

更可定制的方法是 动态 headers。动态 header 像参数一样传递给方法。提供的参数值在执行请求之前由 Retrofit 映射。

定义动态 headers,您可以在其中为每个请求传递不同的值:

编码愉快!!