记录一次OkHttp请求参数的添加BUG

公司项目有需求,需要对所有接口传参进行加密,比如接口传参为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转码,这就意味着参数被转码两次。参数值为英文还行,但如果是特殊符号以及中文,就会导致后台无法解析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值