Retrofit2: добавить параметр записи в перехватчик - PullRequest
0 голосов
/ 04 марта 2019

Внутри моего приложения Android kotlin я вызываю некоторые API, используя retrofit2, например

@FormUrlEncoded
@POST("something/some")
fun callMyApi(
    @Field("myField") myField: String
): Deferred<MyResponseClass>

Теперь мне нужно добавить некоторые общие пост-параметры ко всем моим запросам API (и сохранить конкретные параметры для каждого вызовав этом случае мне нужно оставить «myField»), поэтому я использую перехватчик:

val requestInterceptor = Interceptor { chain ->
    val newRequest = chain.request()
        .newBuilder()
        .post(
            FormBody.Builder()
            .add("common1Key", "common1")
            .add("common2Key", "common2")
            .add("common3Key", "common3")
            .build()
         )
         .build()

    return@Interceptor chain.proceed(newRequest)
}

Но эта реализация не удалась, потому что перехватчик, кажется, перезаписывает myField .Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Я добавил Interceptor для тела почтовой формы.

interface PostWebApiService {  

@POST("posts")
@FormUrlEncoded
fun savePost(
    @Field("title") title: String
): Deferred<Post>

companion object {
    operator fun invoke(): PostWebApiService {
        val requestInterceptor = Interceptor { chain ->
            var request = chain.request()

            val requestBuilder = request.newBuilder()
            val formBody = FormBody.Builder()
                .add("body", "Body")
                .add("userId", "12")
                .build()
            var postBodyString = bodyToString(request.body())
            val concat = if (postBodyString.isNotEmpty()) "&" else ""
            postBodyString = postBodyString + concat + bodyToString(formBody)
            request = requestBuilder.post(
                RequestBody.create(
                    MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"),
                    postBodyString
                )
            )
                .build()
            return@Interceptor chain.proceed(request)
        }
        val okHttpClient = OkHttpClient.Builder()
            .addInterceptor(requestInterceptor)
            .build()
        return Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("http://jsonplaceholder.typicode.com/")
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(PostWebApiService::class.java)
    }

    fun bodyToString(request: RequestBody?): String {
        try {
            var buffer = Buffer()
            request?.writeTo(buffer)
            return buffer.readUtf8()
        } catch (e: IOException) {
            return "error"
        }
    }
}
}
0 голосов
/ 04 марта 2019

Мы можем создать Interceptor, используя два или более общих параметров запроса.

val requestInterceptor = Interceptor { chain ->

            val url = chain.request()
                .url()
                .newBuilder()
                .addQueryParameter("common1key", "common1")
                .addQueryParameter("common2key", "common2")
                .addQueryParameter("common3key", "common3")
                .build()
            val request = chain.request()
                .newBuilder()
                .url(url)
                .build()

            return@Interceptor chain.proceed(request)
        }
...