From 553db03d4dfdaeb54a64e2ef1044be3109f7137f Mon Sep 17 00:00:00 2001 From: czp3009 Date: Thu, 28 Feb 2019 15:50:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AF=84=E8=AE=BA=E5=8F=91?= =?UTF-8?q?=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hiczp/bilibili/api/main/MainAPI.kt | 2 ++ .../bilibili/api/retrofit/HttpConstant.kt | 4 +++ .../interceptor/CommonParamInterceptor.kt | 36 ++++++++++++------- .../com/hiczp/bilibili/api/test/LoginTest.kt | 2 ++ .../hiczp/bilibili/api/test/SendReplyTest.kt | 16 +++++++++ 5 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 src/test/kotlin/com/hiczp/bilibili/api/test/SendReplyTest.kt diff --git a/src/main/kotlin/com/hiczp/bilibili/api/main/MainAPI.kt b/src/main/kotlin/com/hiczp/bilibili/api/main/MainAPI.kt index 36f9531..a947ca6 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/main/MainAPI.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/main/MainAPI.kt @@ -1,6 +1,7 @@ package com.hiczp.bilibili.api.main import com.hiczp.bilibili.api.main.model.* +import com.hiczp.bilibili.api.retrofit.Header import kotlinx.coroutines.Deferred import retrofit2.http.* @@ -152,6 +153,7 @@ interface MainAPI { */ @POST("/x/v2/reply/add") @FormUrlEncoded + @Headers(Header.FORCE_FORM_BODY) fun sendReply( @Field("from") from: Int? = null, @Field("message") message: String, diff --git a/src/main/kotlin/com/hiczp/bilibili/api/retrofit/HttpConstant.kt b/src/main/kotlin/com/hiczp/bilibili/api/retrofit/HttpConstant.kt index 90d5ae1..ef8bf71 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/retrofit/HttpConstant.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/retrofit/HttpConstant.kt @@ -20,6 +20,10 @@ object Header { const val ACCEPT = "Accept" const val ACCEPT_LANGUAGE = "Accept-Language" const val ACCEPT_ENCODING = "Accept-Encoding" + + //强制将公共参数加到 FormBody 上 + const val FORCE_FORM_BODY_NAME = "Force-Form-Body" + const val FORCE_FORM_BODY = "$FORCE_FORM_BODY_NAME: true" } object Param { diff --git a/src/main/kotlin/com/hiczp/bilibili/api/retrofit/interceptor/CommonParamInterceptor.kt b/src/main/kotlin/com/hiczp/bilibili/api/retrofit/interceptor/CommonParamInterceptor.kt index cfb89c1..1424638 100644 --- a/src/main/kotlin/com/hiczp/bilibili/api/retrofit/interceptor/CommonParamInterceptor.kt +++ b/src/main/kotlin/com/hiczp/bilibili/api/retrofit/interceptor/CommonParamInterceptor.kt @@ -1,5 +1,6 @@ package com.hiczp.bilibili.api.retrofit.interceptor +import com.hiczp.bilibili.api.retrofit.Header import com.hiczp.bilibili.api.retrofit.ParamType import com.hiczp.bilibili.api.retrofit.addAllEncoded import com.hiczp.bilibili.api.retrofit.forEachNonNull @@ -17,53 +18,62 @@ private val logger = KotlinLogging.logger {} * @param additionParams ParamName to ParamValueExpression */ class CommonParamInterceptor( - private val paramType: ParamType, + private var paramType: ParamType, private vararg val additionParams: Pair String?> ) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - var request = chain.request() - val body = request.body() + val request = chain.request() + var headers = request.headers() + var httpUrl = request.url() + var body = request.body() - request = when { + //是否强制加到 FormBody + if (headers[Header.FORCE_FORM_BODY_NAME] != null) { + paramType = ParamType.FORM_URL_ENCODED + headers = headers.newBuilder().removeAll(Header.FORCE_FORM_BODY_NAME).build() + } + + when { //如果欲添加参数的位置为 Query 则直接添加, paramType 为 FORM_URL_ENCODED 则继续下面的判断 paramType == ParamType.QUERY -> { - val httpUrl = request.url().newBuilder().apply { + httpUrl = request.url().newBuilder().apply { additionParams.forEachNonNull { name, value -> addQueryParameter(name, value) } }.build() - request.newBuilder().url(httpUrl).build() } //BODY 不存在或者是空的 body == null || body.contentLength() == 0L -> { - val formBody = FormBody.Builder().apply { + body = FormBody.Builder().apply { additionParams.forEachNonNull { name, value -> add(name, value) } }.build() - request.newBuilder().method(request.method(), formBody).build() } //只要 BODY 为 FormBody, 那么里面一定有内容 body is FormBody -> { - val formBody = FormBody.Builder().apply { - addAllEncoded(body) + body = FormBody.Builder().addAllEncoded(body).apply { additionParams.forEachNonNull { name, value -> add(name, value) } }.build() - request.newBuilder().method(request.method(), formBody).build() } else -> { logger.error { "Cannot add params to request: ${request.method()} ${request.url()} ${body.javaClass.simpleName}" } - request } } - return chain.proceed(request) + return chain.proceed( + request.newBuilder() + .headers(headers) + .url(httpUrl) + .method(request.method(), body) + .build() + ) } } diff --git a/src/test/kotlin/com/hiczp/bilibili/api/test/LoginTest.kt b/src/test/kotlin/com/hiczp/bilibili/api/test/LoginTest.kt index 1ae1038..725ff6e 100644 --- a/src/test/kotlin/com/hiczp/bilibili/api/test/LoginTest.kt +++ b/src/test/kotlin/com/hiczp/bilibili/api/test/LoginTest.kt @@ -1,6 +1,7 @@ package com.hiczp.bilibili.api.test import com.hiczp.bilibili.api.BilibiliClient +import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import okhttp3.logging.HttpLoggingInterceptor import org.junit.jupiter.api.Test @@ -12,6 +13,7 @@ class LoginTest { BilibiliClient(logLevel = HttpLoggingInterceptor.Level.BODY) .run { login(Config.username, Config.password) + delay(1000) logout() } } diff --git a/src/test/kotlin/com/hiczp/bilibili/api/test/SendReplyTest.kt b/src/test/kotlin/com/hiczp/bilibili/api/test/SendReplyTest.kt new file mode 100644 index 0000000..935f1b1 --- /dev/null +++ b/src/test/kotlin/com/hiczp/bilibili/api/test/SendReplyTest.kt @@ -0,0 +1,16 @@ +package com.hiczp.bilibili.api.test + +import kotlinx.coroutines.runBlocking +import org.junit.jupiter.api.Test + +class SendReplyTest { + @Test + fun sendRootReply() { + runBlocking { + bilibiliClient.mainAPI.sendReply( + oid = 9498716, + message = "这是自动发送的评论 ${System.currentTimeMillis()}" + ).await() + } + } +}