Android 对拦截请求body重新组装记录

本文介绍了一个使用OkHttp实现的拦截器案例,该拦截器能够根据请求类型进行参数的添加和修改,并对请求和响应进行日志记录。文章详细展示了如何处理POST请求中的JSON参数,同时为GET请求添加了必要的查询参数。
    override fun intercept(@NonNull chain: Interceptor.Chain): Response {
      val newRequest = addParams(chain.request())
      val builder = addHeadParams(newRequest)
   // val body = getRequestBody(newRequest.body)
   // Log.d("errTag", "body:$body")
      val build = builder.build()
      Log.d("errTag", "url:" + build.url)
      val proceed = chain.proceed(build)
      Log.d("errTag", "code:" + proceed.code)
      return proceed
   }


   private fun getRequestBody(requestBody: RequestBody?): String? {
      var body: String? = null
      if (requestBody != null) {
         val buffer = Buffer()
         requestBody.writeTo(buffer)
         var charset: Charset? = utf8
         val contentType = requestBody.contentType()
         if (contentType != null) {
            charset = contentType.charset(utf8)
         }
         if (charset != null)
            body = buffer.readString(charset)
      }
      return body
   }




   //拿到数据重新组装
   private fun addParams(request: Request): Request {
      val method = request.method
      Log.d("errTag", "method:$method")
      val oldUrl = getHttpUrlNew(request)
      val builder = oldUrl.newBuilder()
      val body = request.body

      val buffer = Buffer()
      //method == "POST" && body != null && body is FormBody
      return if (method == "POST" && body != null  ) {
         val bodyBuilder = FormBody.Builder()
         var     daa=bodyBuilder.build().writeTo(buffer);

         val requestbuffer = Buffer()
         var  data=body.writeTo(requestbuffer)
         Log.d("errTag", "body:$requestbuffer")
         var charset = Charset.forName("UTF-8")
         val contentType = body.contentType()
         if (contentType != null) {
            charset = contentType.charset(charset)
         }
         var json = requestbuffer.readString(charset)

         val requestMap = mutableMapOf<Any?, Any?>()

         Log.d("errTag", "body:$json")
         val infoMap: Map<*, *> =
               Gson().fromJson(json, object : TypeToken<Map<String?, String?>?>() {}.type)
//       for ((key, value) in infoMap) {
//          requestMap[key] = value
//       }

//       val stringBuilder = StringBuilder()
//       for (entry in infoMap) {
//          stringBuilder.append(entry)
//          stringBuilder.append("&")
//       }

         var postUrl="";
         val builder = FormBody.Builder()
         builder.add("ContentType","application/json");
         builder.add("url",request.url.toString());
         builder.add("Param", json);
         //builder.add("Param", URLEncoder.encode(json, "UTF-8"));
         request.newBuilder().url(postUrl).post(builder.build()).build()

      }else {
         builder.addEncodedQueryParameter("appname", "") //app名称
         builder.addEncodedQueryParameter("device", "AND") ////设备号 IOS 苹果 AND 安卓 Web 网页
         var versionCode=SystemInfoUtil.getAppVersionCode();
         builder.addEncodedQueryParameter("Version", ""+versionCode) //版本号 纯数字 
         builder.addEncodedQueryParameter("lag", "en") //语言 en英文 zh 中文
         if (null != Util.getMemberInfo() && null!=Util.getMemberInfo().mappingUserId) {
            builder.addEncodedQueryParameter("userId", Util.getMemberInfo().mappingUserId.toString())
            builder.addEncodedQueryParameter("operator_id",Util.getMemberInfo().mappingUserId.toString()) //
            builder.addEncodedQueryParameter("memberid",  Util.getMemberInfo().mappingUserId.toString())
            builder.addEncodedQueryParameter("token", Util.getMemberInfo().chineseToken.toString())
         }else{
            builder.addEncodedQueryParameter("userId", "")
            builder.addEncodedQueryParameter("operator_id", "")
            builder.addEncodedQueryParameter("memberid", "")
         }
         builder.addEncodedQueryParameter("mbname", SystemInfoUtil.getDeviceBrand()) //设备名称
         var url="";
         try {
            url ="url?url="+URLEncoder.encode(builder.toString(), "UTF-8")
            builder.setEncodedPathSegment(0,url);
         } catch (e: UnsupportedEncodingException) {
            e.printStackTrace()
         }

//       builder.addEncodedQueryParameter("appname",appName)
//       builder.addEncodedQueryParameter("Token",Util.getMemberInfo().getChineseToken())
//       builder.addEncodedQueryParameter("device",DEVICE)
//       builder.addEncodedQueryParameter("version", BuildConfig.VERSION_CODE.toString())
//       builder.addEncodedQueryParameter("operator_id", USERID.toString())
////         builder.addEncodedQueryParameter("mbname", Util.getPhoneModel())
//       builder.addEncodedQueryParameter("ptime", System.currentTimeMillis().toString())
          builder.build().toUri();
         request.newBuilder()
               .url(url)
               .build()
      }
   }

   private fun getHttpUrlNew(request: Request): HttpUrl {
      val oldUrl: HttpUrl = request.url
      val requestBuilder: Request.Builder = request.newBuilder()
      val headers: List<String> = request.headers(Constants.HEADER)
      if (!headers.isNullOrEmpty()) {
         requestBuilder.removeHeader(Constants.HEADER)
         when (headers[0]) {
         }
      }
      return oldUrl
   }

// private fun modifyBaseUrl(oldUrl: HttpUrl, url: String): HttpUrl {
//    val toUrl = oldUrl.toString()
//    Log.d("httpTag", "toUrl:$toUrl")
//    if (toUrl.contains(Api.BASE_URL)) {
//       val replace = toUrl.replace(Api.BASE_URL, url)
//       Log.d("httpTag", "replace:$replace")
//       return replace.toHttpUrl()
//    }
//    return oldUrl
// }

   private fun addHeadParams(request: Request): Request.Builder {
      val builder = request.newBuilder().url(request.url)
      builder.addHeader("Authorization",Util.getCardToken())
      val token = TOAKEN
      Log.d("errTag", "token:$token")
      return builder
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值