hello___world___! 2018-03-28 12:05 采纳率: 0%
浏览 2755
已结题

将一段 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来实现。

  • 写回答

1条回答

  • devmiao 2018-03-28 15:38
    关注

    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();  
    }  
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题