最近使用Retrofit+OKHttp+RxJava联合框架开发项目,在开发项目时,遇到公共参数的封装和url重定向问题,个人比较懒,在网上找了部分博客,但还是不能解决问题,最后小伙人不错的博客解决了解决了问题。
根据okhttp的传统,所有的数据都可以通过拦截器去拦截,添加修改参数也一样:
class ParamInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val oldRequest = chain.request()
var postBodyString = bodyToString(oldRequest.body())//获取请求的参数
var param = if (postBodyString.contains("&temp=")) postBodyString.split("temp=")[1] else ""//获取temp参数对应的值
LogUtils.d("param:$param")
var url = oldRequest.url().newBuilder()
if (!TextUtils.isEmpty(param)) {
var p = param.split("&")
for (str in p) {
var s = str.split("%3D")
url.addQueryParameter(s[0], s[1]) //重新拼接url
}
}
var newRequestBuild = oldRequest.newBuilder().url(url.build())//重定向url
//重新组装POST参数
var requestBody = RequestBody.create(
MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"),
postBodyString.split("&temp=")[0]
)
val newRequest = newRequestBuild.method(oldRequest.method(), requestBody).build()
return chain.proceed(newRequest)
}
private fun bodyToString(request: RequestBody?): String {
try {
val buffer = Buffer()
if (request != null)
request.writeTo(buffer)
else
return ""
return buffer.readUtf8()
} catch (e: IOException) {
return "did not work"
}
}
}