OKhttp3总结(一)

基本上现在面试都会问网络框架相关问题,例如目前比较流行的okhttp3以及retrofit,我们先来说一下okhttp

先在gradle中导入okhttp的依赖库:

implementation 'com.squareup.okhttp3:okhttp:3.14.2'
implementation 'com.squareup.okio:okio:1.17.4'

接下来在Manifest中添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

基本使用

1.GET同步请求

//GET同步请求
public void get(){
        //先创建okhttpClient对象
        OkHttpClient client=new OkHttpClient();
        //创建request对象,默认为get请求
        Request request=new  Request.Builder().get().url("http://www.jianshu.com/u/9df45b87cfdf").build();
        //将request传入call对象中
        Call call=client.newCall(request);
        try {
            //调用同步方法
            Response response=call.execute();
            //得到返回结果
            String str=response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.GET异步请求

//GET异步请求
public void get(){
        OkHttpClient okHttpClient=new OkHttpClient();
        Request request=new Request.Builder()
                .get()
                .url("http://www.jianshu.com/u/9df45b87cfdf")
                .build();
        Call call=okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败返回
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //请求成功返回
            }
        });
    }

3.POST异步请求(同步请求类似,在这里就不写代码了)

    public void postParameter(){
        OkHttpClient client=new OkHttpClient();
        FormBody formBody=new FormBody.Builder()
                .add("username","123")
                .add("password","123")
                .build();
        Request request=new Request.Builder()
                .url("http://www.jianshu.com/")
                .post(formBody)
                .build();
        Call call=client.newCall(request);
        call.enqueue(new Callback(){

            @Override
            public void onFailure(Call call, IOException e) {
                //请求失败
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //获得请求成功的内容
                String responseStr=response.body().string();
            }
        });
    }

更多实现方式可以看一看刘望舒的博客:https://blog.csdn.net/itachi85/article/details/51190687

我们在这里总结一下基本的使用流程:先创建OkHttpClient对象,再去创建Request(如果是post请求则创RequestBody),接下来通过我们创建的okhttpClient对象的newCall方法赋值给Call对象,最后call再去调用exectue或者enqueue获得请求结果。

源码分析

1.OkHttpClient的创建

//默认调用此构造函数  
public OkHttpClient() {
    this(new Builder());
  }
//最终调用该构造函数
OkHttpClient(Builder builder) {
    this.dispatcher = builder.dispatcher;
    this.proxy = builder.proxy;
    this.protocols = builder.protocols;
    this.connectionSpecs = builder.connectionSpecs;
    this.interceptors = Util.immutableList(builder.interceptors);
    this.networkInterceptors = Util.immutableList(builder.networkInterceptors);
    this.eventListenerFactory = builder.eventListenerFactory;
    this.proxySelector = builder.proxySelector;
    this.cookieJar = builder.cookieJar;
    this.cache = builder.cache;
    this.internalCache = builder.internalCache;
    this.socketFactory = builder.socketFactory;

    boolean isTLS = false;
    for (ConnectionSpec spec : connectionSpecs) {
      isTLS = isTLS || spec.isTls();
    }

我们发现这些参数都是builder中的参数,我们看看builder中干了什么

public Builder() {
      //任务调度器,控制并发请求,异步的时候通过它来调度所有网络请求
      dispatcher = new Dispatcher();
      //协议,里面有HTTP2和HTTP_1_1
      protocols = DEFAULT_PROTOCOLS;
      //默认连接配置
      connectionSpecs = DEFAULT_CONNECTION_SPECS;
      //事件监听器
      eventListenerFactory = EventListener.factory(EventListener.NONE);
      //代理选择器
      proxySelector = ProxySelector.getDefault();
      if (proxySelector == null) {
        proxySelector = new NullProxySelector();
      }
      //http cookie持久化策略
      cookieJar = CookieJar.NO_COOKIES;
      //socket工厂
      socketFactory = SocketFactory.getDefault();
      //主机名验证
      hostnameVerifier = OkHostnameVerifier.INSTANCE;
      //约束信任证书
      certificatePinner = CertificatePinner.DEFAULT;
      //代理认证
      proxyAuthenticator = Authenticator.NONE;
      //认证者
      authenticator = Authenticator.NONE;
      //连接池
      connectionPool = new ConnectionPool();
      //DNS解析
      dns = Dns.SYSTEM;
      //SSL重定向
      followSslRedirects = true;
      //重定向
      followRedirects = true;
      //是否失败自动重连
      retryOnConnectionFailure = true;
      //完整请求调用时间
      callTimeout = 0;
      //连接超时
      connectTimeout = 10_000;
      //读取超时
      readTimeout = 10_000;
      //发送数据超时
      writeTimeout = 10_000;
      //时间间隔
      pingInterval = 0;
    }

    Builder(OkHttpClient okHttpClient) {
      this.dispatcher = okHttpClient.dispatcher;
      ...
    }

okhttpClient通过建造者模式,在类实例化的时候调用builder将相关参数设为默认值。如果我们创建OkhttpClient通过Builder方式,我们还可以使用Builder中的一些其他的API

OkHttpClient.Builder builder=new OkHttpClient.Builder()
                .addInterceptor()
                .cache()
                .callTimeout()
                .connectionPool()
                //等等很多API
                .build();

至此OkHttpClient就创建完毕,主要就是进行赋值,将okhttpClient的默认参数配置好

需要注意:

OkHttpClient(Builder builder) {

    boolean isTLS = false;
    for (ConnectionSpec spec : connectionSpecs) {
      isTLS = isTLS || spec.isTls();
    }

    if (builder.sslSocketFactory != null 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
okhttp3是一个开源的HTTP客户端库,用于在Java中进行网络请求。它提供了简单易用的API,支持同步和异步请求,以及支持各种功能,如连接池、请求拦截器、缓存等。 在之前的文章《RestTemplate集成okhttp3并自定义日志打印》中已经介绍了如何集成okhttp3,所以本篇文章的重点是介绍如何使用okhttp3进行带p12证书的请求。 首先,在使用okhttp3进行请求之前,我们需要实例化一个RestTemplate对象。这可以通过@Resource注解来注入一个RestTemplate对象,然后配置一个OkHttp3ClientHttpRequestFactory作为RestTemplate的请求工厂。这个工厂可以通过自定义的方式来创建,以支持p12证书的请求。 接下来,在postXmlDataWithCert方法中,我们可以调用setRequestFactory方法将自定义的OkHttp3ClientHttpRequestFactory设置为RestTemplate的请求工厂。然后可以使用RestTemplate的postForObject方法发送带p12证书的POST请求,并获取响应结果。 总结起来,使用okhttp3进行rest请求的步骤大致如下: 1. 集成okhttp3到项目中,可以参考之前的文章《RestTemplate集成okhttp3并自定义日志打印》。 2. 实例化RestTemplate对象,并配置一个自定义的OkHttp3ClientHttpRequestFactory作为请求工厂。 3. 在需要使用带p12证书的请求的地方,调用setRequestFactory方法将自定义的OkHttp3ClientHttpRequestFactory设置为RestTemplate的请求工厂。 4. 使用RestTemplate的相应方法发送请求,并处理响应结果。 请注意,具体的代码实现可能因项目环境和需求的不同而有所差异,可以根据具体情况进行相应的调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【springboot进阶】RestTemplate 集成 okhttp3 请求带p12证书](https://blog.csdn.net/lrb0677/article/details/129232718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后厂村三环十三少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值