首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >OkHttp3拦截器向请求体添加字段

OkHttp3拦截器向请求体添加字段
EN

Stack Overflow用户
提问于 2019-06-09 23:13:50
回答 3查看 3.4K关注 0票数 2

因为我的API请求都包含一些共同的json字段,所以我想在拦截器中添加这些字段,但是我很难修改拦截器中的OkHttp3 RequestBody

这是我的retrofitBuilder:

代码语言:javascript
复制
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()

    }

下面是拦截器:

代码语言:javascript
复制
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”?

EN

回答 3

Stack Overflow用户

发布于 2020-11-19 11:37:36

在我的例子中:

代码语言:javascript
复制
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;
}

}

票数 1
EN

Stack Overflow用户

发布于 2019-06-09 23:37:11

修改了header和body的拦截器:

代码语言:javascript
复制
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:

代码语言:javascript
复制
val okHttpInterceptor = OkHttpInterceptor()
val client = OkHttpClient.Builder()
client.interceptors().add(okHttpInterceptor)
client.build()

也许您还想添加日志记录:

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2019-06-09 23:42:46

虽然我是用java写的,但我觉得你应该用kotlin解决这个问题

代码语言:javascript
复制
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);
         }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56515769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档