【问题标题】:How to add header to retrofit response in Android如何在 Android 中添加标题以改造响应
【发布时间】:2019-12-23 12:44:28
【问题描述】:

在我的应用程序中,我想从服务器获取数据,为此我应该添加一些 header 例如 AcceptContent_Type
为了连接到服务器,我使用了 Retrofit 库。
对于设置标头,我使用 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
                }
            }
    }
}

我该如何解决?

【问题讨论】:

    标签: android kotlin retrofit retrofit2


    【解决方案1】:

    添加静态标头的第一个选项是将您的 API 方法的标头和相应的值定义为注释。 Retrofit 会自动为使用此方法的每个请求添加标头。注释可以是键值对作为一个字符串,也可以是一个字符串列表。

    上面的示例显示了静态标头的键值定义:

    此外,您可以将多个键值字符串作为封装在大括号 {} 中的列表传递给 @Headers 注释。

    如何将多个键值字符串作为封装在大括号中的列表传递:

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

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

    编码愉快!! ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 2020-03-22
      • 2017-08-11
      • 2018-07-07
      • 1970-01-01
      • 2019-08-27
      • 2020-06-02
      • 2019-02-02
      相关资源
      最近更新 更多