欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记录一次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相关

下一篇: 问题记录