将一段 HttpClient 写的代码,改用OkHttp3来实现

以下是HttpClient的代码,功能就是向一个url发送get请求,并携带一个.p12格式的证书文件

 package com.sinnk.web.module.weixin.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

public class Test {

    public static void main(String[] args) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException, UnrecoverableKeyException {
        // TODO Auto-generated method stub
        KeyStore keyStore  = KeyStore.getInstance("PKCS12");
        FileInputStream instream = new FileInputStream(new File("C:\\apiclient_cert.p12"));
        try {
            keyStore.load(instream, "1499761822".toCharArray());
        } finally {
            instream.close();
        }

        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, "1499761822".toCharArray())
                .build();
        // Allow TLSv1 protocol only
        @SuppressWarnings("deprecation")
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom()
                .setSSLSocketFactory(sslsf)
                .build();
        try {

            HttpGet httpget = new HttpGet("https://api.mch.weixin.qq.com/secapi/pay/refund");

            System.out.println("executing request" + httpget.getRequestLine());

            CloseableHttpResponse response = httpclient.execute(httpget);
            try {
                HttpEntity entity = response.getEntity();

                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                if (entity != null) {
                    System.out.println("Response content length: " + entity.getContentLength());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
                    String text;
                    while ((text = bufferedReader.readLine()) != null) {
                        System.out.println(text);
                    }

                }
                EntityUtils.consume(entity);
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }

    }

}

要求用OkHttp3来实现。

public class PersistentCookieStore {

private static final String LOG_TAG = "PersistentCookieStore";

private static final String COOKIE_PREFS = "Cookies_Prefs";

private final Map<String, ConcurrentHashMap<String, Cookie>> cookies;  
private final SharedPreferences cookiePrefs;  


public PersistentCookieStore(Context context) {  
    cookiePrefs = context.getSharedPreferences(COOKIE_PREFS, 0);  
    cookies = new HashMap<String, ConcurrentHashMap<String, Cookie>>();  

    //将持久化的cookies缓存到内存中 即map cookies  
    Map<String, ?> prefsMap = cookiePrefs.getAll();  
    for (Map.Entry<String, ?> entry : prefsMap.entrySet()) {  
        String[] cookieNames = TextUtils.split((String) entry.getValue(), ",");  
        for (String name : cookieNames) {  
            String encodedCookie = cookiePrefs.getString(name, null);  
            if (encodedCookie != null) {  
                Cookie decodedCookie = decodeCookie(encodedCookie);  
                if (decodedCookie != null) {  
                    if (!cookies.containsKey(entry.getKey())) {  
                        cookies.put(entry.getKey(), new ConcurrentHashMap<String, Cookie>());  
                    }  
                    cookies.get(entry.getKey()).put(name, decodedCookie);  
                }  
            }  
        }  
    }  
}  

protected String getCookieToken(Cookie cookie) {  
    return cookie.name() + "@" + cookie.domain();  
}  

public void add(HttpUrl url, Cookie cookie) {  
    String name = getCookieToken(cookie);  

    //将cookies缓存到内存中 如果缓存过期 就重置此cookie  
    if (!cookie.persistent()) {  
        if (!cookies.containsKey(url.host())) {  
            cookies.put(url.host(), new ConcurrentHashMap<String, Cookie>());  
        }  
        cookies.get(url.host()).put(name, cookie);  
    } else {  
        if (cookies.containsKey(url.host())) {  
            cookies.get(url.host()).remove(name);  
        }  
    }  

    //讲cookies持久化到本地  
    SharedPreferences.Editor prefsWriter = cookiePrefs.edit();  
    prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet()));  
    prefsWriter.putString(name, encodeCookie(new SerializableOkHttpCookies(cookie)));  
    prefsWriter.apply();  
}  

public List<Cookie> get(HttpUrl url) {  
    ArrayList<Cookie> ret = new ArrayList<Cookie>();  
    if (cookies.containsKey(url.host()))  
        ret.addAll(cookies.get(url.host()).values());  
    return ret;  
}  

public boolean removeAll() {  
    SharedPreferences.Editor prefsWriter = cookiePrefs.edit();  
    prefsWriter.clear();  
    prefsWriter.apply();  
    cookies.clear();  
    return true;  
}  

public boolean remove(HttpUrl url, Cookie cookie) {  
    String name = getCookieToken(cookie);  

    if (cookies.containsKey(url.host()) && cookies.get(url.host()).containsKey(name)) {  
        cookies.get(url.host()).remove(name);  

        SharedPreferences.Editor prefsWriter = cookiePrefs.edit();  
        if (cookiePrefs.contains(name)) {  
            prefsWriter.remove(name);  
        }  
        prefsWriter.putString(url.host(), TextUtils.join(",", cookies.get(url.host()).keySet()));  
        prefsWriter.apply();  

        return true;  
    } else {  
        return false;  
    }  
}  

public List<Cookie> getCookies() {  
    ArrayList<Cookie> ret = new ArrayList<Cookie>();  
    for (String key : cookies.keySet())  
        ret.addAll(cookies.get(key).values());  

    return ret;  
}  

/** 
 * cookies 序列化成 string 
 * 
 * @param cookie 要序列化的cookie 
 * @return 序列化之后的string 
 */  
protected String encodeCookie(SerializableOkHttpCookies cookie) {  
    if (cookie == null)  
        return null;  
    ByteArrayOutputStream os = new ByteArrayOutputStream();  
    try {  
        ObjectOutputStream outputStream = new ObjectOutputStream(os);  
        outputStream.writeObject(cookie);  
    } catch (IOException e) {  
        Log.d(LOG_TAG, "IOException in encodeCookie", e);  
        return null;  
    }  

    return byteArrayToHexString(os.toByteArray());  
}  

/** 
 * 将字符串反序列化成cookies 
 * 
 * @param cookieString cookies string 
 * @return cookie object 
 */  
protected Cookie decodeCookie(String cookieString) {  
    byte[] bytes = hexStringToByteArray(cookieString);  
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);  
    Cookie cookie = null;  
    try {  
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);  
        cookie = ((SerializableOkHttpCookies) objectInputStream.readObject()).getCookies();  
    } catch (IOException e) {  
        Log.d(LOG_TAG, "IOException in decodeCookie", e);  
    } catch (ClassNotFoundException e) {  
        Log.d(LOG_TAG, "ClassNotFoundException in decodeCookie", e);  
    }  

    return cookie;  
}  

/** 
 * 二进制数组转十六进制字符串 
 * 
 * @param bytes byte array to be converted 
 * @return string containing hex values 
 */  
protected String byteArrayToHexString(byte[] bytes) {  
    StringBuilder sb = new StringBuilder(bytes.length * 2);  
    for (byte element : bytes) {  
        int v = element & 0xff;  
        if (v < 16) {  
            sb.append('0');  
        }  
        sb.append(Integer.toHexString(v));  
    }  
    return sb.toString().toUpperCase(Locale.US);  
}  

/** 
 * 十六进制字符串转二进制数组 
 * 
 * @param hexString string of hex-encoded values 
 * @return decoded byte array 
 */  
protected byte[] hexStringToByteArray(String hexString) {  
    int len = hexString.length();  
    byte[] data = new byte[len / 2];  
    for (int i = 0; i < len; i += 2) {  
        data[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));  
    }  
    return data;  
}}  

[java] view plain copy
public class SerializableOkHttpCookies implements Serializable {

private transient final Cookie cookies;  
private transient Cookie clientCookies;  

public SerializableOkHttpCookies(Cookie cookies) {  
    this.cookies = cookies;  
}  

public Cookie getCookies() {  
    Cookie bestCookies = cookies;  
    if (clientCookies != null) {  
        bestCookies = clientCookies;  
    }  
    return bestCookies;  
}  

private void writeObject(ObjectOutputStream out) throws IOException {  
    out.writeObject(cookies.name());  
    out.writeObject(cookies.value());  
    out.writeLong(cookies.expiresAt());  
    out.writeObject(cookies.domain());  
    out.writeObject(cookies.path());  
    out.writeBoolean(cookies.secure());  
    out.writeBoolean(cookies.httpOnly());  
    out.writeBoolean(cookies.hostOnly());  
    out.writeBoolean(cookies.persistent());  
}  

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {  
    String name = (String) in.readObject();  
    String value = (String) in.readObject();  
    long expiresAt = in.readLong();  
    String domain = (String) in.readObject();  
    String path = (String) in.readObject();  
    boolean secure = in.readBoolean();  
    boolean httpOnly = in.readBoolean();  
    boolean hostOnly = in.readBoolean();  
    boolean persistent = in.readBoolean();  
    Cookie.Builder builder = new Cookie.Builder();  
    builder = builder.name(name);  
    builder = builder.value(value);  
    builder = builder.expiresAt(expiresAt);  
    builder = hostOnly ? builder.hostOnlyDomain(domain) : builder.domain(domain);  
    builder = builder.path(path);  
    builder = secure ? builder.secure() : builder;  
    builder = httpOnly ? builder.httpOnly() : builder;  
    clientCookies =builder.build();  
}  

}