如何将 header 添加到 Android 中的改造响应
How to add header to retrofit response in Android
在我的应用程序中,我想从服务器获取数据,为此我应该添加一些 header,例如 Accept 和Content_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,您可以在其中为每个请求传递不同的值:
编码愉快!!
在我的应用程序中,我想从服务器获取数据,为此我应该添加一些 header,例如 Accept 和Content_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,您可以在其中为每个请求传递不同的值:
编码愉快!!