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

以下是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来实现。

0

1个回答

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

}

-1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java进行Http请求的三种方式总结归纳(JDK/HttpClient/OkHttp3)
需求使然,需要后端使用Java访问特定的第三方接口来进行请求,而这些接口则需要使用Http协议访问。所以归纳了一下目前Java主流的Http访问的三种方式。 第一种:JDK提供  使用java.net.HttpURLConnection 先上代码 /** * 第一种:java.net */ public class HttpConnect { public static Str...
Google摒弃HttpClient之后 OKHttp第三框架
OkHttp在api 4.4之后替换了HttpClient网络交互,4.4之后看到的就是OkHttp,相信大家使用过api 4.4以后的都知道了吧。 1)OkHttp的Get调用方法    //初始化,或得一个OkHttp对象   OkHttpClient client = new OkHttpClient();   //声明一个Request对象,传入一个request对象返
OkHttp的基本使用——替代Apache HttpClient
http是现在主流应用使用的网络请求方式, 用来交换数据和内容, 有效的使用HTTP可以使你的APP 变的更快和减少流量的使用 OkHttp 是一个很棒HTTP客户端: 支持SPDY, 可以合并多个到同一个主机的请求  使用连接池技术减少请求的延迟(如果SPDY是可用的话)  使用GZIP压缩减少传输的数据量  缓存响应避免重复的网络请求 OkHttp可以替换Apache的HttpCli...
用 wait-notify 写一段代码来解决生产者-消费者问题?
一、生产者代码: package com.edu.chapter03.test; import java.util.Vector; import java.util.logging.Level; import java.util.logging.Logger; public class Producer implements Runnable { private final Vector
OKHttp HTTPS 请求证书验证 PEM证书
调用new CustomTrust() 即可产生OkHttpClient 关键点:  1、将pem证书放入Raw或者assets目录。  2、证书的KeyStore读取方式。  3、HostnameVerifier过滤验证。 讲解: Pem 有多个 Certificate ,用CertificateFactory 读取 inputstream 为context.getResour
用base64编码的字符串形式上传图片,并实时更新上传的进度条
刚做完项目里的上传图片并回调进度的需求,可谓一波三折,我就从我的开发过程中先后尝试的不同方法来总结下吧。先说下我们的需求:用base64编码上传图片,并实时更新上传的进度条。第一阶段: 由于我们项目中用的网络框架是async-httpClient,所以刚开始肯定会考虑这个网络框架本身有没有上传图片并回调进度 的接口,当然我们android开发都是用封装好的网络框架,第三方肯定会留上传图片的进度回
Java8中基于OkHttp3编写HTTP2客户端详解
显然,我们必须在Java还没有准备好支持HTTP2客户端编程的情况下(即使用Java 8及以下版本),提供HTTP2客户端应用的解决方案。目前流行的类库如下:   OkHttp Eclipse Jetty Netty Apache HttpComponents (Apache HC) 其中,Eclipse Jetty和Netty都同时提供客户端和服务端。而曾经广泛使用的Apache HC...
多线程 wait-notify 写一段代码来解决生产者-消费者问题
生产者-消费者 该模式在现实生活中很常见,在项目开发中也广泛应用,它是线程间通信的经典应用。 生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用 List集合存储数据。该模式的关键之处是如何处理多线程之间的协调通信,内存缓冲区为空的时候,消费者...
面试题:用 wait-notify 写一段代码来解决生产者-消费者问题
public class ProductTest { public static void main(String[] args) { Clerk clerk = new Clerk(); Thread producerThread = new Thread(new Producer(clerk)); Thread co
【转】关于HttpClient,HttpURLConnection,OkHttp的用法整理
1 HttpClient入门实例 https://blog.csdn.net/qq_39403545/article/details/83033276   2 HttpURLConnection入门实例 https://blog.csdn.net/fightingXia/article/details/71775516 其中文章提到的is2String(inputStream)读取响应结...
java网络爬虫(json+mysql+okhttp3+连接池)的数据挖掘
1、获取数据源 以智联招聘官网为例 从智联官网首页中通过查看源码获取其数据源,通过okhttp获得数据源。 (kHttp是一个优秀的网络请求框架) 2、将网络数据源转换为本地数据 通过json将网络数据转化为本地的数据 (json是一种轻量级的数据交换格式) 3、建立数据库 通过MySQL建立数据库,然后再数据库中建立相关表格,用以存放挖掘的数据。。 4、将数据存入数据...
OkHttp3源码解读一:接口请求层
1、基本介绍: 接口层:接收用户的网络访问请求(同步请求/异步请求),发起实际的网络访问,接受服务器返回的结果。 2、重要类: 2.1、OkHttpClient: OkHttp框架的客户端,更确切的说是一个用户面板,用户使用OkHttp进行各种设置,发起各种网络请求都是通过OkHttpClient完成的。 每个OkHttpClient内部都维护了属于自己的任务队列Dispat...
使用Java编写一个http请求,要求使用HttpClient
HttpClient介绍: HttpClient是Apache提供的一个用于在Java中处理HTTP请求、响应操作的工具,它比JDK中自带的URLConnection更加灵活好用,因此越来越多的人开始使用它来实行对HTTP的请求操作。HttpClient的初级使用我是在IDEA的编译工具上来实现基于HttpClient的HTTP请求实现。首先需要先创建一个Maven项目,并且添加相关的HttpC...
高效的Http客户端 OkHttp3使用
(本文主要写Java后端Get Post请求) 好处: 高效加载HTTP,让资源加载更快,节省带宽,OKHttp是一种高效的HTTP客户端,节省带宽, 默认以下特性: 支持HTTP/2,允许所有同一主机地址的请求共享同一个插座连接 连接池减少请求延迟 透明的GZIP压缩减少响应数据大小 缓存响应内容,避免一些完全重复的请求 当网络出现问题时,OkHttp能够坚守职责,自动恢复一般的连接问题, ...
OkHttp3最佳入门使用
在OkHttp以前大家普遍使用Volley、asyncHttpClient、HttpURLConnection来作为我们应用的网络框架。但是相比于他们OkHttp有什么优点呢?我们看官方给出的介绍: HTTP/2 support allows all requests to the same host to share a socket. Connection pooling reduces ...
HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比,如何选择?
今天突然想起有必要总结一下市面上通用的一些网络请求方式,主要通过分析其优缺点和性能,为以后选择网络请求连接方式提供支持。现在常用的网络请求方式主要有:HttpClient、HttpURLConnection、OKHttp和Volley。 一、HttpClient: HttpClient 是Apache的一个三方网络框架,网络请求做了完善的封装,api众多,用起来比较方便,开发快。实现比
HttpClient实现反向代理功能
本文利用HttpClient实现简单的反向代理功能,对于其中的细节部分,还需要进行仔细地斟酌实现才能适用到生产环境中。HttpClient通过策略模式提供CloseableHttpClient实例的定制,合理地定制可以显著地提供程序的稳当性,需要在生产环境中反复斟酌调试。在请求转发的时候,消息头是需要特别处理的,不合适的处理会出现浏览器无法解析服务器返回的内容等错误。
下载中心:网络框架 OKhttp与Apache对比
为什么我要做两者的对比?因为我在做下载中心(见我的另外一篇文章:功能实现-下载中心)成功率优化时,考虑到了网络底层的优化!这里针对两者的重试机制进行分析,主要结论如下:          整套机制,okhttp的优势是:        (1)重试机制更完善,因为它的出错重试是针对整个流程的;        (2)建立socket连接部分的优化,一定程度上,解决了一些二次连接才会成功的问题;
Python面试题:写一段代码,功能是将本段代码打印出来
前几日,遇到这么一道面试题,记录下来 思路分析: 首先需要获取文件路径,可以使用sys.argv[0],它是命令行参数List,第一个元素是程序本身路径(更多sys模块的常用方法见https://blog.csdn.net/qq_38276669/article/details/83687738) 然后使用with语句打开文件并且读取,with语句当程序报错还可以正常关闭资源 最后输出即可...
okhttp3与旧版本okhttp的区别分析
OkHttp的基本使用 HTTP GET OkHttpClient client = new OkHttpClient(); String doGet(String url) throws IOException {   Request request = new Request.Builder().url(url).build();   Response response = cl
用 wait-notify 解决生产者-消费者问题
用 wait-notify 解决生产者-消费者问题 //生产者 1 package com.mzj.test; 2 import java.util.Vector; 3 import java.util.logging.Level; 4 import java.util.logging.Logger; 5 ...
浅谈wait和notify方法(生产者和消费者案例)
java.lang.Object类提供了wait()、notify()、notifyAll()方法,这些方法只有在synchronized或synchronized代码块中才能使用,是否就会报java.lang.IllegalMonitorStateException异常。 当另外线程执行了某对象的notify方法之后,会唤醒在此对象等待池中的某个线程,使之成为可运行线程。notifyAll...
Android4种网络连接方式HttpClient、HttpURLConnection、OKHttp和Volley优缺点和性能对比
比较的指标: 1、cpu 2、流量 3、电量 4、内存占用 5、联网时间 功能点: 1、重试机制 2、提供的扩展功能 3、易用性 4、是否https 5、是否支持reflect api,OkHttp有配套方法 6、缓存、重试 7、cookie支持session  id会话支持 8、弱网性能和稳定性 9、超时时间,几种超时时间   连接超时,响应
OKHttp3原理分析
https://www.jianshu.com/p/310ccf5cbea6   写在前面 作为一名android开发者,要时时刻刻跟随技术的发展潮流,OKHttp作为当下最流行的网络请求框架我们不得不重视,它的原理也几乎是面试时必问的问题,故而对其进行学习并纪录之。 几个类 OKHttpClient okhttp3在项目中发起请求的代码如下:okHttpClient.newCall(...
通过wait和notify实现的生产者消费者demo
import java.util.ArrayList; import java.util.List; /** * 通过wait和notify实现的生产者消费者demo * User: zhangb * Date: 12-12-1 * Time: 下午7:19 */ public class ProducerAndCustomerDemo { private ...
OKHttp实现大文件的断点续传
本文的亮点: (1)网络请求用OKHttp进行下载大文件 (2)实现了大文件的断点续传 (3)取消下载时,删除已经下载的文件。 实现效果图:          直接给出工程: (1)定义一个接口:DownloadListener.java package com.example.servicebestpractice; /** * Created by Administra
Android常见问题——找不到HttpClient和okHttp的包
今天再用Android Studio进行网络编程的时候遇到了一个问题,就是怎么也找不到HttpClient的包,上网搜了一下也没什么结果,但最后偶然解决问题,下面总结了一下方法: 首先打开File->Project Structure,然后到Modules选中你要导入包的moudle 然后导入上图中的最下面的两个包(第一个为okHttp的包,第二个是HttpClient的包)就可以了
OkHttp3连接建立过程分析
如我们前面在 OkHttp3 HTTP请求执行流程分析 中的分析,OkHttp3通过Interceptor链来执行HTTP请求,整体的执行过程大体如下:这些Interceptor中每一个的职责,这里不再赘述。在OkHttp3中,StreamAllocation是用来建立执行HTTP请求所需网络设施的组件,如其名字所显示的那样,分配Stream。但它具体做的事情根据是否设置了代理,以及请求的类型,如...
《Python核心编程》第11章 函数和函数式编程 练习
11-3 函数。 在这个练习中,我们将实现max()和min()内建函数。 (a) 写分别带两个元素返回一个较大和较小元素,简单的max2()核min2()函数。他们应该可以用任意的python 对象运作。举例来说,max2(4,8)和min2(4,8)会各自每次返回8 和4。 (b) 创建使用了在a 部分中的解来重构max()和min()的新函数my_max()和my_min().这些函数
Android WebView 与OkhttpClient登录状态保持一致,建立SESSION会话
这里我用的是okhttputils工具https://github.com/hongyangAndroid/okhttputils 如果你用okhttpclient,获取session如下,Cookie cookie = ((AbstractHttpClient) client).getCookieStore().getCookies().get(0);
OkHttp和HttpClient支持https访问,多证书加载
项目中通过okhttp请求RESTful接口,使用Httpclient来进行代理访问,目前都需要支持https的访问,证书文件路径已经提供,具体配置如下:   ps:亲测https访问是可以的,由于代码在公司内网,只能以图片方式展示 证书路径:(多个证书以逗号隔开)   okhttp配置:   httpclient代理配置:      httpclient支持https配...
一段python代码,
def ss(n,numlist): #功能:用numlist里面的数字,随意组合,使它们的和凑成n #给列表排序,将大数放前面,以便先尝试大数 numlist.sort(reverse=True) #如果n小于最小对的数,尝试失败,返回0 if (n<min(numlist)): return '0' #逐一核
okhttp3实现注册登陆
注册 private void runRegist() throws InterruptedException { //处理注册逻辑 Thread t1 = new Thread(new Runnable() { @Override public void run() { RESULT
OKHttp3上传图片到服务器
OKHttp3上传图片到服务器 本篇文章介绍了关于okhttp3上传用户头像到服务器 代码块 public class ImgagePhoneoActivity extends AppCompatActivity { private static final int REQUEST_CHOOSE_IMAGE = 0x01; private static final...
第六章 中断和动态数码管
什么叫中断? 对于这个问题,我的理解是,单片机的功能其实并没有我们想象中的那么强大,不同于我们人类大脑的是,单片机在同一个时间只能完成一件事情。所以,单片机在同一个时间内是无法同时完成数码管的刷新和一个数的分离计算。 所谓中断,即在一个事情发生之后又发生另一件事情,这个时候,如果这个事情的优先级高的话,系统 优先处理更高优先级的一件事。 例如,你在看电视的时候,水烧开了
OKHTTP3源码和设计模式(上篇)
本文来探究一下 OkHttp3 的源码和其中的设计思想。 关于 OkHttp3 的源码分析的文章挺多,不过大多还是在为了源码而源码。个人觉得如果读源码不去分析源码背后的设计模式或设计思想,那么读源码的意义不大。 同时,如果熟悉的设计模式越多,那么读某个框架的源码的时候就越容易,两者是相辅相成的,这也是许多大牛认为多读源码能提高编程能力的原因。 整体架构 为了方面后面的理解,我这里简单画了...
(4.2.36.2)HTTP之OkHttp(二): okhttp3与旧版本okhttp的区别分析
一、概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工具类中的方法也是剧增,各种重载方法,以致于使用起来极不方便,实在惭愧。 于是,在这个周末,抽点时间对该工具类,进行了重新的拆解与编写,顺便完善下功能,尽可能的提升其使用起来的方便性和易扩展
初试OkHttp3实现登录功能
在OkHttp3之前的版本需要自己定义ResultCallback用于返回数据,而OkHttp3自带了Callback将这个简化不少,这次我就尝试用下OkHttp3来简单实现注册和登录功能注意 因为是注册和登录的功能,我这里只用post 使用Map封装提交的Post参数 基础用法就不讲了,就直接开始实例吧 封装OkHttp工具类post与get的差别就在于post需要上传post参数,我这里将参数封
HttpClient和OkHttp关于Https请求问题
HttpClient和OkHttp关于Https请求问题
五种实现网络爬虫的方法(三,基于httpclient编写爬虫)
咕咕咕~ 总所周知httpclient是java爬虫的利器, 一般我个人开发,都是用httpclient来编写抓取登陆代理等,用jsoup,xpath,正则来处理解析。 废话不多说直接上代码。 public static String getPageContent(String url) { // 创建一个客户端,类似于打开一个浏览器 DefaultHttpClient http...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 区块链怎么来的 学习java写代码的方法