因为我的API请求都包含一些共同的json字段,所以我想在拦截器中添加这些字段,但是我很难修改拦截器中的OkHttp3 RequestBody
这是我的retrofitBuilder:
private val retrofitBuilder by lazy {
val client = OkHttpClient.Builder().apply {
addInterceptor(MyInterceptor())
}.build()
Retrofit.Builder()
.baseUrl("https://placeholder.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build()
}
下面是拦截器:
class MyInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
//Is it possible to change it in JSON? Or how do I add paramenters to this body?
val body: RequestBody? = chain.request().body()
return chain.proceed(chain.request())
}
}
我如何在拦截器内的所有请求主体中添加,例如"traceId“:"abc123”?
发布于 2020-11-19 11:37:36
在我的例子中:
public class MyInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request = addHeaderFields(request);
request = modifyRequestBody(request);
return chain.proceed(request);
}
/**
* add new Headers
*/
private Request addHeaderFields(Request request) {
return request.newBuilder()
.addHeader("timestamp", String.valueOf(new Date().getTime()))
.addHeader("os", "android")
.build();
}
/**
* add new post fields
*/
private Request modifyRequestBody(Request request) {
if ("POST".equals(request.method())) {
if (request.body() instanceof FormBody) {
FormBody.Builder bodyBuilder = new FormBody.Builder();
FormBody formBody = (FormBody) request.body();
// Copy the original parameters first
for (int i = 0; i < formBody.size(); i++) {
bodyBuilder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));
}
// Add common parameters
formBody = bodyBuilder
.addEncoded("userid", "001")
.addEncoded("param2", "value2")
.build();
request = request.newBuilder().post(formBody).build();
}
}
return request;
}
}
发布于 2019-06-09 23:37:11
修改了header和body的拦截器:
class OkHttpInterceptor() : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val requestWithAndroidHeaders = addHeaderFields(request)
val response = chain.proceed(requestWithAndroidHeaders)
return modifyResponseBody(response)
}
private fun addHeaderFields(request: Request): Request = request.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("User-Agent", "Android")
.addHeader("TraceId", "abc 123")
.build()
private fun modifyResponseBody(response: Response): Response {
val responseString = response.body()?.charStream()?.readText()
val responseJson = responseString?.let { stringToJson(it) }
return if (responseJson != null) {
val contentType: MediaType? = response.body()?.contentType()
val responseBody = ResponseBody.create(contentType, responseJson.toString())
response.newBuilder().body(responseBody).build()
} else {
response
}
}
private fun stringToJson(responseString: String): JSONObject? = try {
JSONObject(responseString).put("traceId", "abc 123")
} catch (e: JSONException) {
println(e.message)
null
}
}
OkHttpClient:
val okHttpInterceptor = OkHttpInterceptor()
val client = OkHttpClient.Builder()
client.interceptors().add(okHttpInterceptor)
client.build()
也许您还想添加日志记录:
val logging = HttpLoggingInterceptor()
if(BuildConfig.DEBUG) {
logging.level = HttpLoggingInterceptor.Level.BODY
} else {
logging.level = HttpLoggingInterceptor.Level.NONE
}
val okHttpInterceptor = OkHttpInterceptor()
val client = OkHttpClient.Builder()
client.interceptors().add(okHttpInterceptor)
client.interceptors().add(logging)
client.build()
发布于 2019-06-09 23:42:46
虽然我是用java写的,但我觉得你应该用kotlin解决这个问题
public Response intercept(@NonNull Chain chain) throws IOException {
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder();
//requestBuilder.addHeader("key",API_KEY);
requestBuilder.addHeader("Content-Type","application/json");
Request request = requestBuilder.build();
return chain.proceed(request);
}
https://stackoverflow.com/questions/56515769
复制相似问题