1. 程式人生 > >Okhttp的Post請求引數在Interceptor中修改

Okhttp的Post請求引數在Interceptor中修改

注意:

基於老闆本的okhttp和rxJava,本部落格可能不適配新版的okhttp和rxJava、retrofit

android在使用rxjava+retrofit+okhttp時有時需要對請求引數進行再次處理。
如下規則:
所有的介面,預設需要帶上sign,timestamp2個引數。
sign: 引數名+引數值拼接之後,先做base64編碼,再做md5加密(加入timestamp, 不加入sign)
引數名 的排序規則按照 ascii 碼順序進行排序
timestamp: (時間戳,秒級)
備註: 引數名和引數值 按照 引數名的ascii 排序

我的處理方式是:

1.定義SignInterceptor類實現Interceptor

import android.util.Log;

import java.io.IOException;
import java.util.Iterator;
import java.util.TreeMap;

import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import qgcp.com.get.util.MD5;


/**
 * Created  16/12/7 15:28.
 */
public class SignInterceptor
implements Interceptor { public SignInterceptor() {} @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); String timestamp = Long.toString(System.currentTimeMillis() / 1000); //拼接timestamp String url = request.
url().toString() + "&timestamp=" + timestamp; //獲取引數列表 String[] parts = url.split("\\?"); //TreeMap裡面的資料會按照key值自動升序排列 TreeMap<String, String> param_map = new TreeMap<String, String>(); //獲取引數對 String[] param_pairs = parts[1].split("&"); for (String pair : param_pairs) { String[] param = pair.split("="); if (param.length != 2) { //沒有value的引數不進行處理 continue; } param_map.put(param[0], param[1]); } StringBuilder sign = new StringBuilder(); Iterator it = param_map.keySet().iterator(); //拼接引數 while (it.hasNext()) { String key = it.next().toString(); String value = param_map.get(key).toString(); sign.append(key + value); } //Base64加密 String sign_s = android.util.Base64.encodeToString(sign.toString().getBytes(), android.util.Base64.NO_WRAP); //Md5加密 sign_s = MD5.GetMD5Code(sign_s); //重新拼接url HttpUrl.Builder httpUrlBuilder = request.url().newBuilder(); //新增引數 httpUrlBuilder.addQueryParameter("sign", sign_s); httpUrlBuilder.addQueryParameter("timestamp", timestamp); Request.Builder requestBuilder = request.newBuilder(); requestBuilder.url(httpUrlBuilder.build()); request = requestBuilder.build(); return chain.proceed(request); } }

2.匯入到okhttp中

  SignInterceptor signInterceptor=new SignInterceptor();
  //配置log列印攔截器
  HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
  loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
  builder.addInterceptor(loggingInterceptor)
  .addInterceptor(signInterceptor)
  .retryOnConnectionFailure(false)
  .addNetworkInterceptor(loggingInterceptor);

md5工具類 和後端保持一致即可

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


/**
 * MD5工具類
*/
public class MD5 {



    private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    public MD5() {
    }

    private static String byteToArrayString(byte bByte) {
        int iRet = bByte;
        // System.out.println("iRet="+iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        int iD1 = iRet / 16;
        int iD2 = iRet % 16;
        return strDigits[iD1] + strDigits[iD2];
    }

    private static String byteToNum(byte bByte) {
        int iRet = bByte;
        System.out.println("iRet1=" + iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        return String.valueOf(iRet);
    }

    private static String byteToString(byte[] bByte) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < bByte.length; i++) {
            sBuffer.append(byteToArrayString(bByte[i]));
        }
        return sBuffer.toString();
    }

    public static String GetMD5Code(String strObj) {
        String resultString = null;
        try {
            resultString = new String(strObj);
            MessageDigest md = MessageDigest.getInstance("MD5");
            resultString = byteToString(md.digest(strObj.getBytes()));
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        return resultString;
    }
}

完結-------