天天看點

Android okhttp添加資料加密攔截器

一、需求

既然要對請求體加密,那肯定要知道請求體在哪裡,然後才能加密,其實都一樣不論是加密url裡面的query内容還是加密body體裡面的都一樣,隻要拿到了對應的資料我們想怎麼做怎麼,有的接口比較奇葩,他需要根據請求體的内容進行簽名認證。不論如何我們拿到了請求體當然想怎麼樣就怎麼樣

二、代碼實作

public class TestInterceptor implements Interceptor {
    private String newHost = "127.0.0.1";

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        HttpUrl url = request.url();

        //http://127.0.0.1/test/upload/img?userName=xiaoming&userPassword=12345
        String scheme = url.scheme();//  http https
        String host = url.host();//   127.0.0.1
        String path = url.encodedPath();//  /test/upload/img
        String query = url.encodedQuery();//  userName=xiaoming&userPassword=12345

        StringBuffer sb = new StringBuffer();
        sb.append(scheme).append(newHost).append(path).append("?");
        Set<String> queryList = url.queryParameterNames();
        Iterator<String> iterator = queryList.iterator();
        
        for (int i = 0; i < queryList.size(); i++) {
            
            String queryName = iterator.next();
            sb.append(queryName).append("=");
            String queryKey = url.queryParameter(queryName);
            //對query的key進行加密
            sb.append(CommonUtils.getMD5(queryKey));
            if (iterator.hasNext()) {
                sb.append("&"); 
            }
        }


        String newUrl = sb.toString();

        Request.Builder builder = request.newBuilder()
                .url(newUrl);

        return chain.proceed(builder.build());
    }
}