嗨,大家好。又和大家见面了,今天我和大家一起来学习一下OKHttp。
OKHttp是基于Http协议上的网络通讯,说白了就是Http协议。Http的功能OKHttp都有。那就问题来了,既然有了Http,这 强大的协议,为什么还需要有OKHttp等将Http封装的架包呢?其实编程是一个工作量大,工作重复性普遍的工作。编程人员都不喜欢做重复性的工作和处理Bug。个人感觉OKHttp就是基于这一系列的因素。所以OKHttp就诞生了。
OkHttp由于基于Http协议,所以http协议都支持。例如请求报文,响应报文,所有的请求方法等多做了很好的的处理。所以有关Http的知识就不详细讲解了,读者可以自己去查询资料了解一下。下面介绍使用OkHttp访问网络。
其实使用OKHttp访问网络很简单,主要通过以下几步:
1、初始化OKHttpClient实例
注:OKHttpClient在整个项目中使用单例模式,尽量直接new实例
//初始化OkHttpClient,OkHttpClient将采用单例模式
private static OkHttpClient okHttpClient = new OkHttpClient();
2、初始化RequestBody实例,用于封装请求的内容(PS:如果使用get请求可以直接省略该步骤)
//初始化RequestBody,用于保存我访问网络的请求信息
RequestBody requestBody = RequestBody.create(JSONTYPE, requestContent);
3、初始化Request实例,用于封装请求信息
Request request = builder.url(url).build();
4、初始化Call实例,用于访问网络
//初始化Call对象,用于访问网络
Call call = okHttpClient.newCall(request);
5、访问网络,OKhttp访问网络提供了两种方法
5.1、同步方法,返回Response对象,该对象封装了网络资源信息
//初始化Response对象,用于显示访问网络的响应头信息
Response response = call.execute();
5.2、异步方法 (PS:异步方法采用Callback接口回调机制)
/*
* 采用异步方法访问网络,返回响应报文信息
* */
public void enqueue(String url, Callback callback, String requestContent) {
if (requestContent == null || "".equals(requestContent)) {
//采用异步get方法访问网络
Request request = this.getRequest(url);
//初始化Call对象,用于网络连接
Call call = okHttpClient.newCall(request);
//采用异步访问网络
call.enqueue(callback);
} else {
//采用异步post方法访问网络
Request request = this.getRequest(url, requestContent);
//初始化Call对象,用于网络连接
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
}
6、通过Response获得网络资源
//初始化ResponseBody对象,用于封装网络资源,该实体用许多访问网络资源的方法
ResponseBody body = response.body();
//以字符串的形式获得网络
result = body.string();
//以字符流的形式获得网络
//body.charStream();
//以字节的形式获得网络
// body.bytes();
//以字节流的形式获得网络
//body.byteStream();
//获得响应头
Headers headers = response.headers();
//遍历响应头信息
for (int i = 0; i < headers.size(); i++){
Log.d("tag",headers.name(i) + "--->" + headers.value(i));
}
通过以上的步骤就可以访问网络了,很简单嘛。但别以为OKHttp就只有这点功能,我这里仅仅简单介绍一下,帮助大家引进门,最好的学习方法就是看APi,看源码学习,了解大神的编程思想。
下面我将我学习OKHttp过程编写的工具类copy出来,提供大家学习。
/*
*
* 该工具类采用单例模式
* */
public class OkHttpUtils {
//初始化OkHttpClient,OkHttpClient将采用单例模式
private static OkHttpClient okHttpClient = new OkHttpClient();
//初始化OkHttpUtils
private static OkHttpUtils okHttpUtils = new OkHttpUtils();
//发送请求消息为Json类型
private static final MediaType JSONTYPE = MediaType.parse("application/*; charset=utf-8");
//构造私有的构造器,使外部不能直接创建实例
private OkHttpUtils() {
}
//采用单例模式中饿汉模式
public static OkHttpUtils getInstance() {
return okHttpUtils;
}
//采用类方法获得单一的OkHttpClient实例
public static OkHttpClient getOkHttpClient() {
return okHttpClient;
}
/*
* 获得get方法Request的请求信息
* */
private Request getRequest(String url) {
return getRequest(url, null);
}
/*
* 获取响应头
* */
public void getHeader(String url) {
getHeader(url, null);
}
/*
* 获取响应头
* */
public void getHeader(String url, String requestContent) {
//初始化Request对象用于封装请求消息
Request request = this.getRequest(url, requestContent);
try {
//访问网络,获得响应信息
Response response = this.execute(request);
//获得响应头
Headers headers = response.headers();
//遍历响应头信息
for (int i = 0; i < headers.size(); i++){
Log.d("tag",headers.name(i) + "--->" + headers.value(i));
}
} catch (IOException e) {
e.printStackTrace();
}
}
/*
* call.execute()访问网络,返回响应报文信息
* */
private Response execute(Request request) throws IOException {
//初始化Call对象,用于访问网络
Call call = okHttpClient.newCall(request);
//初始化Response对象,用于显示访问网络的响应头信息
Response response = call.execute();
return response;
}
/*
* 采用异步方法访问网络,返回响应报文信息
* */
public void enqueue(String url, Callback callback) {
enqueue(url, callback, null);
}
/*
* 采用异步方法访问网络,返回响应报文信息
* */
public void enqueue(String url, Callback callback, String requestContent) {
if (requestContent == null || "".equals(requestContent)) {
//采用异步get方法访问网络
Request request = this.getRequest(url);
//初始化Call对象,用于网络连接
Call call = okHttpClient.newCall(request);
//采用异步访问网络
call.enqueue(callback);
} else {
//采用异步post方法访问网络
Request request = this.getRequest(url, requestContent);
//初始化Call对象,用于网络连接
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
}
/*
* 获得post方法的Request请求信息,当requestContent信息为null时,默认为get请求
* */
private Request getRequest(String url, String requestContent) {
if ("".equals(requestContent) || requestContent == null) {
//定义Rquest对象,封装访问网络的请求信息
//new Request.Builder()创建Request的内部类Builder的对象,默认通过get方法访问网络
Request.Builder builder = new Request.Builder();
//关联访问网络的url,并将其转换为Request对象
Request request = builder.url(url).build();
return request;
} else {
//初始化RequestBody,用于保存我访问网络的请求信息
RequestBody requestBody = RequestBody.create(JSONTYPE, requestContent);
//初始化Request,用于封装请求报头
Request request = new Request.Builder().url(url).post(requestBody).build();
return request;
}
}
//OkHttpClient的get方法
public Object get(String url) throws IOException {
Object result = null;
//关联访问网络的url,并将其转换为Request对象
Request request = this.getRequest(url);
Response response = this.execute(request);
//检测网络是否连接成功
if (response.isSuccessful()) {
//获取网连接信息
String mess = response.message();
Log.d("tag", "mess = " + mess);
//初始化ResponseBody对象,用于封装网络资源,该实体用许多访问网络资源的方法
ResponseBody body = response.body();
//以字符串的形式获得网络
result = body.string();
//以字符流的形式获得网络
//body.charStream();
//以字节的形式获得网络
// body.bytes();
//以字节流的形式获得网络
//body.byteStream();
} else {
//如果没有连接成功则抛出io异常,答应出错误码
throw new IOException("Unexcepted code = " + response.code());
}
return result;
}
//OkHttpClient的get方法
public Object post(String url, String requestContent) throws IOException {
String result = null;
//初始化Request,用于封装请求报头
Request request = this.getRequest(url, requestContent);
//访问网络,返回相应报文
Response response = this.execute(request);
//检测网络是否连接成功
if (response.isSuccessful()) {
//获取网连接信息
String mess = response.message();
Log.d("tag", "mess = " + mess);
//初始化ResponseBody对象,用于封装网络资源,该实体用许多访问网络资源的方法
ResponseBody body = response.body();
//以字符串的形式获得网络
result = body.string();
//以字符流的形式获得网络
//body.charStream();
//以字节的形式获得网络
// body.bytes();
//以字节流的形式获得网络
//body.byteStream();
} else {
//如果没有连接成功则抛出io异常,答应出错误码
throw new IOException("Unexcepted code = " + response.code());
}
return result;
}
}
PS: 以上代码可以Copy在项目中直接运行
最后感谢大家的阅读,由于本人是菜鸟,知识有限,有错误的地方欢迎大家提出。
分享到:
相关推荐
以上就是 OkHttp 的基本用法,包括 GET 和 POST 请求的同步与异步执行,以及上传键值对、JSON 数据和文件的方法。在实际项目中,你还可以根据需要进行更复杂的配置,例如设置自签名证书、HTTPS 代理等。了解并熟练...
本篇文章将详细介绍OkHttp的基础使用方法以及一个简单的封装示例。 首先,了解OkHttp的核心概念: 1. **OkHttpClient**:OkHttp的客户端对象,它是整个网络请求的入口点。通过配置不同的拦截器(Interceptor)、...
本文将深入探讨OkHttp3的使用和封装,旨在帮助开发者更好地理解和掌握这一强大的网络请求工具。 首先,让我们了解OkHttp的基本概念。OkHttp是由Square公司开发的,它提供了一个高效的HTTP客户端接口,具有缓存、...
本文将详细介绍如何在Java项目中使用OkHttp,以及两种主要的请求方式。 首先,使用OkHttp前需要添加相应的依赖。通常,你可以通过Maven或Gradle来引入OkHttp及其依赖。在Maven的pom.xml文件中,你需要添加以下依赖...
在Android开发中,OkHttp是一个高效且易用的网络请求库,由...通过实践,你将更深入地理解OkHttp的工作原理和用法,提升你的应用程序的网络性能。在实际开发中,还可以结合Retrofit等库进一步简化网络请求的处理。
本篇文章将详细讲解Volley、OkHttp和Retrofit这三种常用的网络请求库的基本用法,帮助开发者更好地理解和选择适合自己的请求方式。 **Volley** Volley是由Google官方推出的网络请求库,它专注于Android平台,提供...
通过上述示例,你已经掌握了OkHttp的基本用法,包括GET和POST请求,以及图片下载和文件上传。在实际应用中,还需要考虑错误处理、异步请求、超时设置等高级特性。同时,使用OkHttp配合Retrofit等库可以进一步简化...
通过上述案例,我们可以看到OkHttp在Android开发中的基本使用方法。这个框架提供了丰富的功能,如HTTPS支持、WebSocket、自动重试、连接池等,使得网络请求变得简单高效。结合实际项目需求,开发者可以灵活地定制...
下面将详细介绍 OkHttp3 的使用方法。 OkHttp3 的基本使用 OkHttp3 的基本使用主要包括以下几个步骤: 1. 导入 OkHttp3 相关包,包括 okhttp-2.7.5 和 okio-1.13.02。 2. 创建 OkHttpClient 实例,用于发起网络...
首先,我们了解下OkHttp的基本用法。OkHttp通过构建Request对象来定义网络请求,然后通过OkHttpClient实例发送这个请求。Request对象包含了URL、方法(GET或POST)、请求头和请求体等信息。OkHttpClient则负责处理...
**OKHttp简介** OKHttp是Square公司开发的一款高效、易用的网络请求库,广泛应用于Android应用开发中。...相比于Android自带的...在实际开发中,熟练掌握OKHttp的使用,能有效提高应用的网络性能和用户体验。
以上就是OkHttp基本使用的一些关键点,包括GET和POST请求、文件上传与下载以及拦截器的使用。通过这些功能,开发者可以灵活高效地处理各种HTTP任务。在实际项目中,还可以结合Retrofit等库进一步提升API调用的便利性...
以上就是OKHttp3的基本使用方法。通过这些API,开发者可以方便地实现各种网络请求操作,同时享受到OKHttp提供的高效和稳定。在实际项目中,还可以根据需要进行更复杂的配置,例如添加拦截器、处理Cookie、使用HTTPS...
首先,我们来了解OkHttp3的基本概念。OkHttp3是Square公司推出的一个网络请求库,它通过复用TCP连接、支持HTTP/2协议以及高效的缓存机制,显著提高了网络请求的效率和响应速度。在SpringBoot中集成OkHttp3,可以为...
总结来说,"Android开发 okhttp网络请求使用demo"是一个实用的学习资源,它涵盖了OkHttp的基础用法和文件上传。通过对这个demo的深入学习,开发者可以更好地理解和运用OkHttp来优化Android应用的网络性能。
以上就是关于Android的OkHttp3框架中GET和POST请求的基本使用方法,通过这个库,开发者可以高效、安全地进行网络通信。在实际项目中,可以根据需求进行更复杂的定制和优化,例如设置超时、重试策略等。希望这个概述...
OkHttp是Java和Android开发中广泛使用的网络通信库,由Square公司开发,它以其高效、易用和灵活性著称。本篇文章将详细讲解如何在实际项目中使用OkHttp进行HTTP的GET和POST请求。 首先,我们需要理解HTTP的基本概念...
首先,我们需要了解OkHttp3的基本用法。OkHttp通过构建Request对象并将其发送到服务器来发起网络请求。二次封装的目标是隐藏这些细节,提供一个简洁易用的接口给开发者。以下是一些核心概念: 1. **创建...
下面将详细介绍OkHttp的简单使用。 一、OkHttp的优势 1. **缓存机制**:OkHttp支持自动缓存,可以减少不必要的网络请求,提高用户体验。 2. **线程安全**:OkHttp是线程安全的,可以在多个线程中并发使用。 3. **...
在Android开发中,Retrofit和OkHttp是两个非常重要的网络请求库。Retrofit是由Square公司推出的,它将网络请求转换为简单的...通过理解这两个库的工作原理和使用方法,你可以更轻松地处理Android应用的网络通信需求。