记录一次OkHttp请求参数的添加BUG
程序员文章站
2022-03-03 18:53:07
...
公司项目有需求,需要对所有接口传参进行加密,比如接口传参为a=111,b=222,这时候要通过“a=111,b=222”进行加密生成一个sign="333“。
为此就通过okHttp的拦截器进行公共参数的添加。
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
request=addCommonParams(request)
if (builder.headers.size() > 0) {//添加默认header请求体
val headers = request.headers()
val names = headers.names()
val iterator = names.iterator()
val requestBuilder = request.newBuilder()
requestBuilder.headers(builder.headers)
while (iterator.hasNext()) {
val name = iterator.next()
headers.get(name)?.let {
requestBuilder.addHeader(name,it)
}
}
request = requestBuilder.build()
}
其中addCommonParams()就是我所做的公共参数添加方法
val oldBody = oldRequest.body()
when (oldBody) {
is FormBody -> {
val formBodyBuilder = FormBody.Builder()
newRequestBuild = oldRequest.newBuilder()
val bodyParams = TreeMap<String, String>()
for ( i in 0 until oldBody.size()){//获取之前的请求参数
bodyParams[oldBody.name(i)]=oldBody.value(i)
}
bodyParams["timestamp"]=System.currentTimeMillis().div(1000).toString()
bodyParams["sign"]=SignUtil.createSign("",bodyParams)
for( key in bodyParams.keys){
formBodyBuilder.add(key,bodyParams[key]!!)
}
newRequestBuild.post(formBodyBuilder.build())
}
里面逻辑是先取出之前旧有请求参数,对参数进行处理。然后创建新的请求体,将整个请求参数全部放入新的里。
这里有两个坑,原有方法来自于互联网,其中
bodyParams[oldBody.name(i)]=oldBody.value(i)
BUG:
获取的不是name,而是encodedNmae与encodedValue,这两个方法获取的是已经进行过utf-8转码的请求参数,如果将这两个值放入新请求中,新请求会对这俩值进行再次utf-8转码,这就意味着参数被转码两次。参数值为英文还行,但如果是特殊符号以及中文,就会导致后台无法解析。
上一篇: npm scripts相关
下一篇: 问题记录