OKHttp3使用详解

okhttp是当下主流的网络请求的开源框架,效率很高,使用起来也非常方便,本文就来讲解一下okhttp的具体使用

一、整体流程

先上代码,发起一个GET请求的完整流程如下

//创建okhttp客户端
//在实际项目中,应该复用OkHttpClient,做成配置类交给spring容器管理
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
        //连接失败时是否重试
        .retryOnConnectionFailure(false)
        //连接池
        .connectionPool(new ConnectionPool(200, 5, TimeUnit.MINUTES))
        //连接超时
        .connectTimeout(30, TimeUnit.SECONDS)
        //读超时
        .readTimeout(30, TimeUnit.SECONDS)
        //写超时
        .writeTimeout(30, TimeUnit.SECONDS)
        .build();

//构建url
HttpUrl httpUrl = HttpUrl.parse("http://localhost:8080/hello");
HttpUrl.Builder builder = httpUrl.newBuilder();
builder.addQueryParameter("param1", "value");
httpUrl = builder.build();

//        HttpUrl httpUrl = new HttpUrl.Builder()
//                //通信协议
//                .scheme("http")
//                //域名
//                .host("localhost")
//                //路径
//                .addPathSegment("hello")
//                //请求参数
//                .addQueryParameter("param1", "value")
//                //端口号
//                .port(8080)
//                .build();

//构建请求
Request request = new Request.Builder()
        //GET请求方式
        .get()
        //HttpUrl或url字符串
        .url(httpUrl)
        .build();

//创建一个通话
Call call = okHttpClient.newCall(request);

//执行请求,结束时关闭连接
try (Response response = call.execute()) {
    //返回响应
    if (response.isSuccessful() && 200 == response.code()) {
        //将响应体转化成字符串
        System.out.println(response.body().string());
    } else {
        //失败时返回失败信息
        System.out.println(response.message());
    }
} catch (IOException e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
}
}

POST请求

//创建okhttp客户端
//在实际项目中,应该复用OkHttpClient,做成配置类交给spring容器管理
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
        //连接失败时是否重试
        .retryOnConnectionFailure(false)
        //连接池
        .connectionPool(new ConnectionPool(200, 5, TimeUnit.MINUTES))
        //连接超时
        .connectTimeout(30, TimeUnit.SECONDS)
        //读超时
        .readTimeout(30, TimeUnit.SECONDS)
        //写超时
        .writeTimeout(30, TimeUnit.SECONDS)
        .build();

String json = "{\"param\":\"value\"}";
//构建url
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);

//构建请求
Request request = new Request.Builder()
        //POST请求方式
        .post(body)
        //HttpUrl或url字符串
        .url("http://localhost:8080/hello")
        .build();

//创建一个通话
Call call = okHttpClient.newCall(request);
//执行请求,结束时关闭连接
try (Response response = call.execute()) {
    //返回响应
    if (response.isSuccessful() && 200 == response.code()) {
        //将响应体转化成字符串
        System.out.println(response.body().string());
    } else {
        //失败时返回失败信息
        System.out.println(response.message());
    }
} catch (IOException e) {
    e.printStackTrace();
    System.out.println(e.getMessage());
}

二、实体类讲解

1.OkHttpClient

okhttp使用OkHttpClient来创建网络请求,因此首先应该创建一个OkHttpClient。
使用OkHttpClient来配置发起网络请求的各种参数,如超时时间,连接池,是否重试等等。
另外OkHttpClient应该是全局唯一的,没必要重复创建,这样才可以使用连接池来提供使用效率。

OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
        //连接失败时是否重试
        .retryOnConnectionFailure(false)
        //连接池
        .connectionPool(new ConnectionPool(200, 5, TimeUnit.MINUTES))
        //连接超时
        .connectTimeout(30, TimeUnit.SECONDS)
        //读超时
        .readTimeout(30, TimeUnit.SECONDS)
        //写超时
        .writeTimeout(30, TimeUnit.SECONDS)
        .build();
2.HttpUrl

每一个http请求首先要有一个请求的url地址。因此我们首先需要构建一个HttpUrl。
可以配置通信协议,域名,端口号,路径等等。

HttpUrl httpUrl = new HttpUrl.Builder()
		//通信协议
        .scheme("http")
        //域名
        .host("localhost")
        //路径
        .addPathSegment("hello")
        //请求参数
        .addQueryParameter("param1", "value")
        //端口号
        .port(8080)
        .build();

也可以直接传入一个url字符串

HttpUrl httpUrl = HttpUrl.parse("http://localhost:8080/hello");
HttpUrl.Builder builder = httpUrl.newBuilder();
builder.addQueryParameter("param1", "value");
httpUrl = builder.build();
3.RequestBody

如果是POST请求的话,就需要一个请求体,可以在请求体中添加参数

String json = "{\"param\":\"value\"}";
//构建url
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),json);
3.Request

有了HttpUrl后,就可以构建一个请求,也就是Request类

Request request = new Request.Builder()
		//请求方式为GET
        .get()
        //HttpUrl或url字符串
        .url(httpUrl)
        .build();
Request request = new Request.Builder()
        //POST请求方式
        .post(body)
        //HttpUrl或url字符串
        .url("http://localhost:8080/hello")
        .build();
3.Call

有了Request后,就可以使用okHttpClient来创建一个通话,此时请求还未执行。
使用execute()发起同步请求,使用enqueue()发起异步请求。

//创建一个通话
Call call = okHttpClient.newCall(request);
Response response = call.execute();
4.Response

使用Call发起请求,得到目标服务器的响应后,会返回一个Response对象。
可以从Response中获取响应体,获得通信结果,状态码等。

    //返回响应
    if (response.isSuccessful() && 200 == response.code()) {
        //将响应体转化成字符串
        System.out.println(response.body().string());
    } else {
        //失败时返回失败信息
        System.out.println(response.message());
    }
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OkHttp是一个开源的HTTP客户端库,用于在Android和Java应用程序中进行网络请求。它提供了简单且强大的API,使得发送和接收HTTP请求变得更加容易。在使用OkHttp时,首先需要创建一个OkHttpClient实例,该实例用于配置和执行HTTP请求。然后,可以使用OkHttpClient创建一个Request对象,该对象包含了请求的URL、请求头和请求体等信息。接下来,可以使用OkHttpClient的newCall方法创建一个Call对象,该对象表示一个异步的HTTP请求任务。可以通过调用Call对象的enqueue方法来执行异步请求,并传入一个Callback对象来处理请求的响应结果。在Callback对象的onResponse方法中,可以获取到请求的响应数据,而在onFailure方法中,可以处理请求失败的情况。[1] OkHttp和Retrofit是相辅相成的,Retrofit是对OkHttp的上层封装,它提供了更加简洁和高级的API来进行网络请求。在使用OkHttp时,可以通过创建一个OkHttpClient实例来配置网络请求的一些参数,例如连接超时时间、读取超时时间等。然后,可以使用OkHttpClient创建一个Request对象,该对象包含了请求的URL、请求头和请求体等信息。接下来,可以使用OkHttpClient的newCall方法创建一个Call对象,该对象表示一个异步的HTTP请求任务。可以通过调用Call对象的enqueue方法来执行异步请求,并传入一个Callback对象来处理请求的响应结果。[2] 在OkHttp中,execute方法表示同步请求,即在当前线程中执行网络请求,而enqueue方法表示异步请求,即使用OkHttp内置的线程池来执行网络请求。这涉及到OkHttp的任务分发器,它负责将请求任务分发给线程池中的线程来执行。通过使用异步请求,可以避免在主线程中进行网络请求,从而提高应用的响应速度和用户体验。[3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

笑我归无处

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

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

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

打赏作者

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

抵扣说明:

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

余额充值