一. 前言

OkHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司开发。OkHttp3是Java和Android都能用,Android还有一个著名网络库叫Volley,那个只有Android能用。

OkHttp 是一个默认高效的 HTTP 客户端:

  • HTTP/2 支持允许对同一主机的所有请求共享一个套接字。
  • 连接池减少了请求延迟(如果 HTTP/2 不可用)。
  • 透明 GZIP 可缩小下载大小。
  • 响应缓存完全避免网络重复请求。

使用 OkHttp 很容易。它的请求/响应 API 设计有流畅的构建器和不变性。它支持同步阻塞调用和带有回调的异步调用。

官方地址:https://square.github.io/okhttp

二. 导入

maven

      <dependency>
          <groupId>com.squareup.okhttp3</groupId>
          <artifactId>okhttp</artifactId>
          <version>4.6.0</version>
      </dependency>

gradle

compile 'com.squareup.okhttp3:okhttp:4.6.0'

三. 设置超时时间

OkHttpClient 默认的 connectTimeout,readTimeout,writeTimeout 都是10秒,实际在应用体验上来说,有点短的。
项目中最好 connectTimeout = 10s,readTimeout= 60s,writeTimeout = 60s,如果涉及到下载上传,实际应该修改成更长的。

在创建 OkHttpClient 客户端时设置超时时间:

OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)//连接超时(单位:秒)
.readTimeout(60, TimeUnit.SECONDS)//读取超时(单位:秒)
.writeTimeout(60, TimeUnit.SECONDS)//写入超时(单位:秒)
.callTimeout(120, TimeUnit.SECONDS)//整个流程耗费的超时时间(单位:秒)--很少人使用
.pingInterval(5, TimeUnit.SECONDS)//websocket轮训间隔(单位:秒)
.build();

在这里插入图片描述
旧版本设置超时时间:

client .connectTimeout(15, TimeUnit.SECONDS)
       .readTimeout(15,TimeUnit.SECONDS)
       .writeTimeout(15,TimeUnit.SECONDS)

:建立OkHttp 客户端并发送POST请求;

  public Result executeSql(User loginUser, String sqlParam) {
          client = new OkHttpClient.Builder()
                  .connectTimeout(20, TimeUnit.SECONDS)
                  .readTimeout(60,TimeUnit.SECONDS)
                  .build();

          // 发起建立连接的请求
          String url="http://localhost:11080/intelligentanalysis/sqlgateway/getConnection/";
          RequestBody body=new FormBody.Builder()
                  .add("ip","10.0.47.23")
                  .add("port","2003")
                  .build();
          String token="xxxxxxxx";
          return post(url,body,token);
    }

 private String post(String url, RequestBody body,String token) {
        try {
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .addHeader("smart_token",token)
                    .build();
            Response response = client.newCall(request).execute();
            String returnString = response.body().string();
            logger.debug(returnString);
            return returnString;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

参考:
https://zhuanlan.zhihu.com/p/635599854
https://blog.csdn.net/weixin_46048515/article/details/120032790

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐