【Android】浅析OkHttp(1)

【Android】浅析OkHttp(1)

OkHttp 是一个高效、轻量级的 HTTP 客户端库,主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求,还支持许多高级功能,如连接池、透明的 GZIP 压缩、响应缓存、WebSocket 等。OkHttp3 是 OkHttp 的第三个大版本,在稳定性和功能性方面进行了很多改进。

今天主要介绍OkHttp3。

OkHttp基本用法

使用前

配置gradle

implementation ("com.squareup.okhttp3:okhttp:3.2.0")

异步 GET 请求

最简单的 GET 请求,请求博客地址,代码如下所示:

	Request.Builder requestBuilder = new Request.Builder().url("http://blog.youkuaiyun.com/itachi85");
	requestBuilder.method("GET", null)Request request = requestBuilder.build()OkHttpClient mOkHttpClient = new OkHttpClient()Call mcall = mOkHttpClient.newCall(request);
	mcall.enqueue(new Callback() {
   
		@Override
		public void onFailure(Call call, IOException e) {
   

		}
		@Override
 		public void onResponse(Call call, Response response) throws IOException {
   
			String str = response.body().string()Log.d(TAG str)}
 	})

其基本步骤就是创建 OkHttpClient、Request 和 Call,最后调用 Call 的 enqueue()方法。但是 每次这么写很麻烦,肯定是要进行封装的。需要注意的是 onResponse 回调并非在 UI 线程。如 果想要调用同步 GET 请求,可以调用 Call 的 execute 方法。

同步 GET 请求

代码示例如下:

OkHttpClient client = new OkHttpClient();

// 创建Request对象
Request request = new Request.Builder()
    .url("https://jsonplaceholder.typicode.com/posts")
    .build();

// 同步发送请求
try (Response response = client.newCall(request).execute()) {
   
    if (response.isSuccessful()) {
   
        // 打印响应内容
        System.out.println(response.body().string());
    } else {
   
        System.out.println("Request Failed");
    }
} catch (IOException e) {
   
    e.printStackTrace();
}

在同步请求中,execute() 方法会阻塞线程,直到服务器返回响应。这里 Response 通过 try-with-resources 自动关闭流。

异步 POST 请求

OkHttp 3 异步 POST 请求和 OkHttp 2.x 有一些差别,就是没有 FormEncodingBuilder 这个类, 替代它的是功能更加强大的 FormBody。这里访问淘宝 IP 库,代码如下所示:

RequestBody formBody = new FormBody.Builder()
				.add("ip",59.108.54.37)
				.build()Request request = new Request.Builder()
		.url("http://ip.taobao.com/service/getIpInfo.php")
        .post(formBody)
		.build()OkHttpClient mOkHttpClient = new OkHttpClient()Call call = mOkHttpClient.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 str = response.body().string()Log.d(TAG, str)}
})

这与异步 GET 请求类似,只是多了用 FormBody 来封装请求的参数,并传递给 Request。

设置超时时间和缓存

和 OkHttp 2.x 有区别的是 OkHttp 3 不能通过 OkHttpClient 直接设置超时时间和缓存了,而 是通过 OkHttpClient.Builder 来设置。通过 builder 配置好 OkHttpClient 后用 builder.build()来返回 OkHttpClient。所以我们通常不会调用 new OkHttpClient()来得到 OkHttpClient,而是通过 builder.build()得到 OkHttpClient。另外,OkHttp 3 支持设置连接、写入和读取的超时时间,如下 所示:

File sdcache = getExternalCacheDir()int cacheSize = 1010241024OkHttpClient.Builder builder = new OkHttpClient.Builder()
				.connectTimeout(15, TimeUnit.SECONDS)
				.writeTimeout(20, TimeUnit.SECONDS)
				.readTimeout(20, TimeUnit.SECONDS)
				.cache(new Cache(sdcache.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值